2011/04/07

define-method

gauche の define-method 。お試しコード垂れ流し。
(define-method dispatch ((i <integer>)(sym <symbol>))
  (print 4)
  (set! total (+ total i))
  (set! sum (string->symbol (string-append (symbol->string sum)(symbol->string sym))))
  (list total sum))

(define-method dispatch ((proc <procedure>)(i <integer>)(sym <symbol>))
  (print 3)
  (rlet1 r (dispatch i sym)
         (proc total ":" sum)))

(define-method dispatch ((proc <procedure>)(i <integer>)(sym <symbol>) . rest)
  (print 2)
  (dispatch i sym)
  (apply dispatch proc rest))

(define-method dispatch ((i <integer>)(sym <symbol>) . rest)
  (print 1)
  (dispatch i sym)
  (apply dispatch print rest))


(define total 0)
(define sum 'a)

(fluid-let ((total 0)
            (sum 'a))
  (dispatch 1 'a 2 'b))
;; 1
;; 4
;; 3
;; 4
;; 3:aab
;; (3 aab)

(fluid-let ((total 0)
            (sum 'a))
  (dispatch 1 'a 1 'a 1 'b 4 'c))
;; 1
;; 4
;; 2
;; 4
;; 2
;; 4
;; 3
;; 4
;; 7:aaabc
;; (7 aaabc)

(fluid-let ((total 0)
            (sum 'a))
  (dispatch 1 'a 1 'a 1 'b 4 'c 5 'd 6 'e))
;; 1
;; 4
;; 2
;; 4
;; 2
;; 4
;; 2
;; 4
;; 2
;; 4
;; 3
;; 4
;; 18:aaabcde
;; (18 aaabcde)
  • (A1 A2 …) という特定化子リストをもつメソッド a と (B1 B2 …) という特定化子リストをもつメソッド b とが あるとします。 
  • An と Bn とが異る最小の n を見つけます。n 番目の 引数のクラスをとり、そのクラスの順位リストをチェックします。もし、 その CPL の中で、An が Bn より先にくれば、method a は メソッド b より特定化されているということにし、さもなければ、 b が a がより特定化されているということにします。
  • もし、a および b のすべての特定化子が、一方は rest 引数 をもち、もう一方はもたないという以外同じであれば、rest 引数をもたない メソッドのほうがそうでないものより特定化されているとします。

プログラミングGauche

0 件のコメント:

コメントを投稿