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)))))
解決にはなってないけど。