← Архив: Scheme

Стиль, понятность и т.п.

Author: · 25.01.2011 09:23
· original author: anokata
Доброго времен суток.
Если кому не трудно, то пожалуйста очените этот код и выскажите своё мнение о нём.
Хотелось бы знать насколько плох мой стиль.
(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)
· original author: archimag
> оцените этот код и выскажите своё мнение о нём.
Читать же невозможно. И потом, это же scheme.
· original author: anokata
вообще это racket.
а что не так? *забыло про отступы*
· original author: archimag
> а что не так? *забыло про отступы*
Ну не отступов, ничего, как это вообще читать?
> вообще это racket.
Ну да у нас тут всё больше про CL )
· original author: archimag
А, не заметил, что пост в разделе "Scheme", вообще забыл, что такой есть ).
· original author: anokata
#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)
так не лучше?
· original author: archimag
Ну я бы отформатировал как-нибудь так:
(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 не пишу.
· original author: lithp
переписано с СИ? :)
· original author: anokata
хм... Ясно. Благодарю.
· original author: anokata
нет. с CL :)
· original author: korvin
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)
)
)

я бы как-то так написал
· original author: korvin
соответственно использование:
(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)