ryos36の日記 (Scheme Switch)

 | 

2008-01-06

ついでに CLOS による習作

19:05

(defclass register-machine-instance()
  (
  regs
  opes
  controller))

(defmethod make-register ((m register-machine-instance) regs)
  (let ((h (make-hash-table)))
    (mapcar #'(lambda (r) (setf (gethash r h) nil)) regs)
    (setf (slot-value m 'regs) h)))

(defmethod assign ((m register-machine-instance) regs-name operand)
  (labels ((eval-operand (operand)
                         (let ((s (car operand)))
                           (cond ((eq s 'regs) (gethash (cadr operand) (slot-val
ue m 'regs)))
                                 ((eq s 'const) (cadr operand))
                                 (t
                                   (assert (eq s 'op))
                                   (niy "eval-op"))))))
    (setf (gethash regs-name (slot-value m 'regs))
          (eval-operand operand))))

(let ((*debug-flag* t)
      (m (make-instance 'register-machine-instance)))
  (do-test-case
    (print (make-register m '(a b c)))
    (print (assign m 'a '(const 312)))
    nil
    ))

書いたはいいがいまいちだな。 defstruct でいいじゃん。 On Lisp の defmethod を斜め読み。なるほど、オブジェクト指向というよりは関数主体なんだな。

継承が必要ないなら(そして、本当に必要なさそうだし)、CLOS の必要性はない。(とおもう) CLOS 自身も信者っている、じゃなくて死んじゃっているみたいだし。でその作者?のSonya E. Keene は dylan に移行したみたいだしね。

いやそもそも私の設計が間違っているぞ、、、やっぱりプログラムは設計(メタファーの構築)が重要だ。

 |