> 1 <

Автор Сообщение

isource

Members


Статус

13 сообщений

Где: Russia
Род занятий: NEET
Возраст:

#2483   2010-06-19 20:19 GMT+3 часа(ов)      
А как в Схеме обстоят дела с моднючим ООП?

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2484   2010-06-19 21:25 GMT+3 часа(ов)      
Для Схемы разработано более десятка различных библиотек реализующих поддержку ООП. Самыми старыми из них являются Tiny CLOS (базируется на идеях CLOS) и YASOS, они появились в начале 90-х.

Может нужно что-то поконкретнее?

isource

Members


Статус

13 сообщений

Где: Russia
Род занятий: NEET
Возраст:

#2491   2010-06-19 21:46 GMT+3 часа(ов)      
Просто не знаю с чего начать, а до этого плотно занимался ООП.
Читал, что использование set! не тру, а на нём вроде всё держится.
Пока понятно только одно - для первого приближения надо как-то создать структуру и присобачить к ней функции...

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2493   2010-06-19 21:56 GMT+3 часа(ов)      
>Читал, что использование set! не тру
Где Вы это прочли?

isource

Members


Статус

13 сообщений

Где: Russia
Род занятий: NEET
Возраст:

#2495   2010-06-19 22:05 GMT+3 часа(ов)      
http://habrahabr.ru/blogs/lisp/76077/
Вот тут на видео говорится, что это отход от чистого ФП.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2496   2010-06-19 22:23 GMT+3 часа(ов)      
>Вот тут на видео говорится, что это отход от чистого ФП.
Схема не является чисто ФЯП, т.к. разрабатывалась под мультипарадигмальность.

isource

Members


Статус

13 сообщений

Где: Russia
Род занятий: NEET
Возраст:

#2497   2010-06-20 01:13 GMT+3 часа(ов)      
>Может нужно что-то поконкретнее?
Ничего не смыслю ни в макросах, ни в тонкостях разметки, хотелось бы понять как можно создать какую-нибудь структуру, допустим ноды дерева (подключать куда-то библиотеки не умею). Чтобы было красиво, а не через cdadadaar

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 27

#2498   2010-06-20 01:37 GMT+3 часа(ов)      
Возьмите лучше common-lisp тогда. У нас CLOS, истинная метапарадигменность и куча фишечек. Если не понравится, без труда перейдёте на схему.
Вот пример простенькой структуры ноды (тут классы и не нужны - то):

(defstruct node
(value 0 :type fixnum)
(left nil :type (or null node))
(right nil :type (or null node)))
 
(defvar *example-node*
(make-node :value 1
:left (make-node :value 2)
:right (make-node :value 3)))
 
(print *example-node*)
> #S(NODE :VALUE 1
:LEFT #S(NODE :VALUE 2 :LEFT NIL :RIGHT NIL)
:RIGHT #S(NODE :VALUE 3 :LEFT NIL :RIGHT NIL))
 
(print (node-value *example-node*))
> 1
 
(print (node-left *example-node*))
> #S(NODE :VALUE 2 :LEFT NIL :RIGHT NIL)
 


При объявлении структуры defstruct'ом для неё автоматически объявляется конструктор make-<имя-структуры> (в данном случае make-node), значения полей которой будут равны указанным ключевым параметрам в вызове конструктора, либо, в противном случае, проинициализированны значениями-по-умолчанию. Также для каждого поля автоматически генерируется функция аксессор вида <имя-структуры>-<имя-поля> (в данном случае, это функции node-value, node-left, node-right).

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2499   2010-06-20 02:46 GMT+3 часа(ов)      
> (define-record-type my-pair
(kons x y)
my-pair?
(x kar set-kar!)
(y kdr set-kdr!))
set-kdr!
> (kons 1 (kons 2 '()))
#{<my-pair> 1 #{<my-pair> 2 ()}}
> (kdr (kons 1 2))
2
> (define x (kons 1 '()))
x
> (set-kdr! x 2)
#unspecified
> x
#{<my-pair> 1 2}
> (my-pair? x)
#t

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2500   2010-06-20 02:57 GMT+3 часа(ов)      
> (define-struct my-pair x y)
#unspecified
> (define a (my-pair 1 (my-pair 2 '())))
a
> a
#{my-pair 1 #{my-pair 2 ()}}
> (my-pair? a)
#t
> (my-pair-y a)
#{my-pair 2 ()}
> (make-my-pair 90)
#{my-pair 90 90}
> (my-pair-x-set! a 1234)
#unspecified
> a
#{my-pair 1234 #{my-pair 2 ()}}

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 27

#2501   2010-06-20 03:01 GMT+3 часа(ов)      
Мои глазаааа..! Да ладно, шучу ( это по поводу первого примера : ) В стандартной схеме структуры можно типизировать? А в памяти они будут выравниваться и будут ли ложиться на стек? Есть ли контроль над представлением, позволяющий структуры размещать и как массивы с оффсетами (как в сишке) и как списки?

isource

Members


Статус

13 сообщений

Где: Russia
Род занятий: NEET
Возраст:

#2503   2010-06-20 03:35 GMT+3 часа(ов)      
Обнаружился ещё такой способ хранить данные - в замыкании функции
(define (make-node key value left right)
(lambda (code) (code key value left right)))
(define (make-leaf key value)
(make-node key value '() '()))
(define (node-key node) (node (lambda (key value left right) key)))
(define (node-value node) (node (lambda (key value left right) value)))
(define (node-left node) (node (lambda (key value left right) left)))
(define (node-right node) (node (lambda (key value left right) right)))

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2504   2010-06-20 16:01 GMT+3 часа(ов)      
>В стандартной схеме структуры можно типизировать?
Стандарт оставляет это на совести разработчиков. Но при необходимости можно добавить "жесткую" типизацию самостоятельно.

>А в памяти они будут выравниваться и будут ли ложиться на стек?
>Есть ли контроль над представлением, позволяющий структуры размещать и как массивы с оффсетами (как в сишке) и как списки?
Если мы имеем дело с компилятором (или интерпретатором с поддержкой ffi) поддерживающем Си массивы, структуры и указатели, то да. Вообще компиляторы это отдельный разговор.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2507   2010-06-20 16:22 GMT+3 часа(ов)      
>Обнаружился ещё такой способ хранить данные - в замыкании функции
Сам написал?) Лично мне нравится.

isource

Members


Статус

13 сообщений

Где: Russia
Род занятий: NEET
Возраст:

#2536   2010-06-21 22:06 GMT+3 часа(ов)      
> Сам написал?) Лично мне нравится.
Нет, тоже в интернете вычитал.

На досуге пытался присобачить функции к чему-то типа класса "корявое дерево", (которое не самобалансируется).
 
; sort of class
(define (make-plain-tree less?)
(define (plain-insert node key value)
(cond
((null? node) (make-leaf key value))
((less? (node-key node) key) (make-node
(node-key node)
(node-value node)
(cond
((null? (node-left node)) (make-leaf key value))
(else (plain-insert (node-left node) key value)))
(node-right node)))
((less? key (node-key node)) (make-node
(node-key node)
(node-value node)
(node-left node)
(cond
((null? (node-right node)) (make-leaf key value))
(else (plain-insert (node-right node) key value)))))
(else (error 'key-already-exist "Record with this key already exists."))))
(define (plain-search node key)
(cond
((null? node) (error 'key-not-exist "Key not exists."))
((less? (node-key node) key) (plain-search (node-left node) key))
((less? key (node-key node)) (plain-search (node-right node) key))
(else (node-value node))))
(define (make-plain-tree-dispatcher top insert search)
(lambda (code) (code top insert search)))
(define (tree-top tree) ; private
(tree (lambda (top insert search) top)))
(make-plain-tree-dispatcher
'()
(lambda (tree key value)
(make-plain-tree-dispatcher (plain-insert (tree-top tree) key value) (tree-insert tree) (tree-search tree)))
(lambda (tree key)
(plain-search (tree-top tree) key))))
 
; fetch virtual fun
(define (tree-insert tree) ; public
(tree (lambda (top insert search) insert)))
(define (tree-search tree) ; public
(tree (lambda (top insert search) search)))
 
; sum sugar
(define (insert tree key value)
((tree-insert tree) tree key value))
(define (search tree key)
((tree-search tree) tree key))
 

По идее если теперь сделать класс "Ъ-дерево" с теми же эмм... функциями, вроде самобалансирующегося "make-br-tree", то какой-нибудь
 
(define x (make-???-tree <))
(search (insert (insert x 5 'f) 8 'eight) 8)
 

будет делать те же трюки "эффективнее"

Однако тут нехватает чего-то типа контроля типов, ничто не мешает вместо дерева (случайно) подставить любую функцию, и начнётся неведомо вообще что.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2537   2010-06-21 22:25 GMT+3 часа(ов)      
Переходите на Racket)
Если нужен контроль типов, то используйте Typed Racket.
А r5rs оставьте для студентов) он для них создавался)

isource

Members


Статус

13 сообщений

Где: Russia
Род занятий: NEET
Возраст:

#2559   2010-06-23 17:37 GMT+3 часа(ов)      
Продолжил пытаться создать что-то типа класса "академическими" средствами
 
#lang racket
 
; name: "tree.rkt"
; date: "2010-06-23"
 
; interface
(define-struct tree (data insert remove search))
 
; plain-tree "class"
(define (make-plain-tree less?)
; node substructure
(define-struct node (key value left right))
(define (make-leaf key value)
(make-node key value '() '()))
; methods
(define (plain-insert node key value)
(cond
((null? node) (make-leaf key value))
((less? (node-key node) key) (make-node
(node-key node)
(node-value node)
(cond
((null? (node-left node)) (make-leaf key value))
(else (plain-insert (node-left node) key value)))
(node-right node)))
((less? key (node-key node)) (make-node
(node-key node)
(node-value node)
(node-left node)
(cond
((null? (node-right node)) (make-leaf key value))
(else (plain-insert (node-right node) key value)))))
(else (error 'key-already-exists "Record with this key already exists."))))
(define (plain-remove-aux-maximum node)
(cond
((null? (node-left node)) node)
(else (plain-remove-aux-maximum (node-left node)))))
(define (plain-remove node key)
(cond
((null? node) (error 'key-not-exists "Key not exists."))
((less? (node-key node) key) (make-node
(node-key node)
(node-value node)
(plain-remove (node-left node) key)
(node-right node)))
((less? key (node-key node)) (make-node
(node-key node)
(node-value node)
(node-left node)
(plain-remove (node-right node) key)))
(else
(cond
((null? (node-right node)) (node-left node))
((null? (node-left node)) (node-right node))
(else (let ((r (plain-remove-aux-maximum (node-right node))))
(make-node
(node-key r)
(node-value r)
(node-left node)
(plain-remove (node-right node) (node-key r)))))))))
(define (plain-search node key)
(cond
((null? node) (error 'key-not-exists "Key not exists."))
((less? (node-key node) key) (plain-search (node-left node) key))
((less? key (node-key node)) (plain-search (node-right node) key))
(else (node-value node))))
(define (make-tree-internal tree data)
(make-tree
data
(tree-insert tree)
(tree-remove tree)
(tree-search tree)))
(make-tree '()
(lambda (tree key value)
(make-tree-internal tree (plain-insert (tree-data tree) key value)))
(lambda (tree key)
(make-tree-internal tree (plain-remove (tree-data tree) key)))
(lambda (tree key)
(plain-search (tree-data tree) key))))
 
; sugar
(define (t-insert tree key value)
((tree-insert tree) tree key value))
(define (t-remove tree key)
((tree-remove tree) tree key))
(define (t-search tree key)
((tree-search tree) tree key))
 
; export
(provide make-plain-tree)
;(provide make-avl-tree) ::TODO::
;(provide make-rb-tree) ::TODO::
;(provide make-splay-tree) ::TODO::
(provide t-insert)
(provide t-remove)
(provide t-search)
 

Получилась скорее похожее на структуру С с указателями на функции. Полиморфизм присутствует, но вот ни о инкапсуляции, ни о наследовании речи не идёт. Впрочем, возможно инкапсулировать уровне модуля, но вот с наследованием - совсем худо. Впрочем, в таком подходе внезапно оказались и плюсы - можно прямо в коде конструировать свои собственные классы "на лету".
> 1 <


Онлайн :

0 пользователь(ей), 35 гость(ей) :




Реклама на сайте: