LISP Scheme

このエントリーをはてなブックマークに追加
794デフォルトの名無しさん
>>792
良い方法は思い付かない。
多分、書き換えるしかない気が・・
ソース見た感じでは、
(assq generic specialised-methods)の辺りを
第2引数以降も判定する様に書き換えればなんとかなりそうだけど。
795デフォルトの名無しさん:01/09/11 03:19
その場合、最も限定的なmethodからヒットする様に
specialise!される度に、methodを引数についてソートする。

あとは総称関数の登録インターフェースに↓みたいな形式を許可する。
(specialise! add (list <number> <number>)
(lambda (call-next-method l r) (+ l r) ))
796デフォルトの名無しさん:01/09/11 03:21
いっそのことマクロで↓みたいにするとか。
(defmethod add ((l <number>) (r <number>)) (+ l r))

つーか、tiny-clos辺りに乗り換えては?
(実装が3倍ぐらい大きいけど)
797デフォルトの名無しさん:01/09/11 03:44
あと考えられるのは、
↓の様な、明示的型変換を行なう総称関数を作って、
(define-generic ->number)

+に渡る型を<number>のみになる様にフィルタリングするとか。
(specialise! add <number>
 (lambda (call-next-method obj . args)
  (apply + (cons obj (map ->number args)))))

解決にはなってないけど。