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