Доброго времен суток.
Если кому не трудно, то пожалуйста очените этот код и выскажите своё мнение о нём.
Хотелось бы знать насколько плох мой стиль.
(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)