> 1 <

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

anokata

Members


Статус

9 сообщений

Где: St. Helena Jamestown
Род занятий:
Возраст: 79

#3886   2011-01-25 12:17 GMT+3 часа(ов)      
Доброго времен суток.
Если кому не трудно, то пожалуйста очените этот код и выскажите своё мнение о нём.
Хотелось бы знать насколько плох мой стиль.

(define (make-rejim name act conds)
(list name (list act conds)))
(define rejims% (class object%
(field (rejims (make-eq-hashtable))
(cname null) (cact null) (cconds null) (jyouken null))
(define/private (name r) (car r))
(define/private (act r) (caadr r))
(define/private (conds r) (cadadr r))
(define/public (add rej)
(hashtable-set! (get-field rejims this) (name rej) rej))
(define/private (get name)
(hashtable-ref (get-field rejims this) name #f))
(define/public (move name)
(if (eq? name cname)
(cact jyouken)
(let ((rej (get name)))
(when rej
(begin
(set-field! cname this name)
(set-field! cact this (act rej))
(set-field! cconds this (conds rej))
(cact jyouken)
)))))
(define/public (update njyouken)
(define (iter-cond rest)
(when (pair? rest)
(let ((conda ((car rest) jyouken)))
(if conda
(move conda)
(iter-cond (cdr rest)))
)))
(set-field! jyouken this njyouken)
(iter-cond cconds))
(super-new)))
;использование
(define m (new rejims%))
(send m add (make-rejim 'test (lambda (jyouken2) (print 4)) (list
(lambda (j) (if (eq? j #\q) 'exit #f))
(lambda (j2) (if (eq? j2 #\t) 'test #f)))))
 
(send m add (make-rejim 'exit (lambda (jyouken) (print 5)) (list
(lambda (j2) (if (eq? j2 #\t) 'test #f))
(lambda (j) 'exit))))
(send m move 'test)
(send m update #\q)
[: +.`*./ (3 2="0 2])@(-~ [: +/ ((3&# ,. 9&$) <: i.3) |.!.0 ]) , ] ^:

misha

Moderators


Статус

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

#3887   2011-01-25 15:08 GMT+3 часа(ов)      
Если Вы писали на Рэкете, тогда:
1)
(field (rejims (make-eq-hashtable))
(cname null) (cact null) (cconds null) (jyouken null))
Использование такого количества неиспользуемых, незащищенных открытых полей довольно опасно для публичного класса. Поэтому если Вы не собираетесь создавать приватный абстрактный класс, то либо избавьтесь от открытых полей, либо используйте контракты.

2) Используйте стандартные библиотеки, т.е. воспользуйтесь make-hash вместо make-eq-hashtable.

3) (get-field rejims this) эквивалентно rejims, а (set-field! cname this name) эквивалентно (set! cname name). get-field и set-field! обычно используются для доступа к открытым полям вне класса.

4) (when rej (begin ...)) эквивалентно (when rej ...).

5) (define/public (update njyouken) (define (iter-cond rest) ...) ...) объявление iter-cond излишне, я бы рекомендовал использовать цикл do, либо на крайний случай letrec.

6) (if (eq? j #\q) 'exit #f) эквивалентно (and (eq? j #\q) 'exit)

anokata

Members


Статус

9 сообщений

Где: St. Helena Jamestown
Род занятий:
Возраст: 79

#3888   2011-01-25 15:17 GMT+3 часа(ов)      
Благодарю за столь полезный ответ.
Можно узнать что такое "контракты", где об этом почитать?
И как сделать поля не публичными?

Чем плох make-eq-hashtable? он вроде в стандарте r6rs.
[: +.`*./ (3 2="0 2])@(-~ [: +/ ((3&# ,. 9&$) <: i.3) |.!.0 ]) , ] ^:

misha

Moderators


Статус

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

#3889   2011-01-25 16:16 GMT+3 часа(ов)      
> Можно узнать что такое "контракты", где об этом почитать?
А Вы что читаете? У Рэкета есть Reference: Racket(входит в стандартный комплект документации).

> И как сделать поля не публичными?
Класс - это лямбда, поэтому используйте define или define-values.

> Чем плох make-eq-hashtable? он вроде в стандарте r6rs.
Импортировать необходимо только то, что не предоставляется стандартными библиотеками Рэкета. В конце концов, r6rs и его либы реализованы на Рэкете.

anokata

Members


Статус

9 сообщений

Где: St. Helena Jamestown
Род занятий:
Возраст: 79

#3890   2011-01-25 16:25 GMT+3 часа(ов)      
Его и читаю. Дело в том что не знаю как "контракты" там по английски называются.
[: +.`*./ (3 2="0 2])@(-~ [: +/ ((3&# ,. 9&$) <: i.3) |.!.0 ]) , ] ^:

misha

Moderators


Статус

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

#3891   2011-01-25 16:55 GMT+3 часа(ов)      
контракт - contract
> 1 <


Онлайн :

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