Регистрация | Войти
Lisp — программируемый язык программирования
RSS
Стиль, понятность и т.п.
anokata - 25.01.2011 09:23, Сообщений - 12
Доброго времен суток.
Если кому не трудно, то пожалуйста очените этот код и выскажите своё мнение о нём.
Хотелось бы знать насколько плох мой стиль.


(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)

[#]
> оцените этот код и выскажите своё мнение о нём.

Читать же невозможно. И потом, это же scheme.
archimag - 25.01.2011 11:13
[#] Ответ на комментарий от archimag 25.01.2011 11:13

вообще это racket.

а что не так? *забыло про отступы*

anokata - 25.01.2011 11:53
[#] Ответ на комментарий от anokata 25.01.2011 11:53
> а что не так? *забыло про отступы*

Ну не отступов, ничего, как это вообще читать?

> вообще это racket.

Ну да у нас тут всё больше про CL )
archimag - 25.01.2011 11:55
[#] Ответ на комментарий от archimag 25.01.2011 11:55
А, не заметил, что пост в разделе "Scheme", вообще забыл, что такой есть ).
archimag - 25.01.2011 11:57
[#] Ответ на комментарий от archimag 25.01.2011 11:55

#lang racket
(define (make-rejim name action conds)
  (list name (list action  conds))
)


(define rejims% (class object%
                  (field (rejims (make-eq-hashtable))
                         (cname null) (current-action null)  (cconds null) (jyouken null)
)

                  
                  (define/private (name r)  (car r))
                  (define/private (action 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)
                        (current-action jyouken)
                        (let ((rej (get name)))
                          (when rej
                            (begin
                              (set-field! cname this name)
                              (set-field! current-action this (action rej))
                              (set-field! cconds this (conds rej))
                              (current-action 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)
так не лучше?
anokata - 25.01.2011 12:10
[#] Ответ на комментарий от anokata 25.01.2011 12:10
Ну я бы отформатировал как-нибудь так:

(define rejims%
  (class object%
     (field (rejims (make-eq-hashtable))
            (cname null)
            (current-action null)
            (cconds null)
            (jyouken null)
)

     (define/private (name r)  
         (car r)
)

     (define/private (action 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)
             (current-action jyouken)
             (let ((rej (get name)))
               (when rej
                 (begin
                    (set-field! cname
                                this name
)

                    (set-field! current-action
                                this
                                (action rej)
)

                    (set-field! cconds
                                this
                                (conds rej)
)

                    (current-action 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)
)
)

А по содержанию ничего сказать не могу, ибо на racket не пишу.
archimag - 25.01.2011 12:32
[#] Ответ на комментарий от anokata 25.01.2011 12:10
переписано с СИ? :)
lithp - 25.01.2011 12:36
[#] Ответ на комментарий от archimag 25.01.2011 12:32
хм... Ясно. Благодарю.
anokata - 25.01.2011 12:37
[#] Ответ на комментарий от lithp 25.01.2011 12:36
нет. с CL :)
anokata - 25.01.2011 12:37
[#]
1) использование транслита нежелательно;
2) селекторы типа rejim (значения которого создаются с помощью make-rejim): name, act, conds должны находится в описании типа rejim, а не "стороннего" класса (rejims%); если они не должны быть доступны извне модуля, то просто не нужно их экспортировать;
3) что за слово jyouken? =)


#lang racket

(struct mode (name action conds))

(define modes%
  (class object%
    (field (modes          (make-hasheq))
           (cname           null)
           (current-action  null)
           (cconds          null)
           (jyouken         null)
)


    (define/public  (add mode)
      (hash-set! modes (mode-name mode) mode)
)


    (define/private (get name)
      (hash-ref  modes name #f)
)


    (define/public  (move name)
      (if (eq? name cname)
          (current-action jyouken)
          (let ((mode (get name)))
            (when mode
              (set! cname name)
              (set! current-action (mode-action mode))
              (set! cconds (mode-conds mode))
              (current-action jyouken)
)
)
)
)


    (define/public (update new-jyouken)
      (define (iter lst)
        (match lst
          ((list)      (void))
          ((cons x xs) (if x (move x) (iter xs)))
)
)

      (set! jyouken new-jyouken)
      (iter cconds)
)


    (super-new)
)
)

я бы как-то так написал
korvin - 02.03.2011 13:25
[#] Ответ на комментарий от korvin 02.03.2011 13:25
соответственно использование:

(define m (new modes%))

(send m add (mode 'test
                  (lambda (j) (print 4))
                  (list
                   (lambda (j) (if (eq? j #\q) 'exit #f))
                   (lambda (j) (if (eq? j #\t) 'test #f))
)
)
)


(send m add (mode 'exit
                  (lambda (j) (print 5))
                  (list
                   (lambda (j) (if (eq? j #\t) 'test #f))
                   (lambda (j) 'exit)
)
)
)


(send m move 'test)

(send m update #\q)

korvin - 02.03.2011 13:36
[#] Ответ на комментарий от korvin 02.03.2011 13:25
jyouken это условие по японски ^^
anokata - 29.03.2011 10:57
@2009-2013 lisper.ru