eji

江尻です。

いろいろとGaucheにお世話になっています。 これからKahuaとかにも手を出していこうかなと思っています。

MLに出さないようなネタがあればこっちに

スペシャライザについて

最近,特定の文字列やシンボル,数値ごとにメソッドを定義できるたらいいなと思ってます。 あまり良い例だと思わないのですが(^^;

gosh> (define-method div (a (b := 0))
         'hoge)

gosh> (define-method div (a b)
         (/ a b))

gosh> (div 4 0)
hoge
gosh> (div 4 2)
2

gosh> (define-method hoge ((num :>= 0))
         'positive)
gosh> (define-method hoge ((num :< 0))
         'negative)

gosh> (hoge 0)
'positive
gosh> (hoge 3)
'positive
gosh> (hoge -1)
'negative

適当に書いたので汚いパッチですが上記のように動くはずです。 パッチ

調べてみたらここで議論されてたっぽい。Shiroさんが考えているEQLスペシャライザ相当の機能ってどんな感じなんだろ? 早く使ってみたいな〜

Shiro(2006/04/03 11:35:36 PDT): なるほど、eql specializerみたいに等価性だけ でなくて、条件を指定できるようにするわけですね。 応用によってはおもしろいことが出来そうですが、コアに取り込むには難があります。

gosh> (define-method hoge ((a :<= 0))
        'negative)
gosh> (define-method hoge ((a := 0))
        'zero)
gosh> (define-method hoge ((a :>= 0))
        'positive)
gosh> (hoge 0)
'zero

私としては、「デフォルトにするには重いけれど、<generic>をサブクラスして こういう機能をつけ足すライブラリとしてならあっても良いかな」と思います。 そうするなら、specializers配列にclassしか入れられないって制限は取っておいた 方がいいかなあ。eql specializerはそのspecializer専用のクラスをon the fly で作成することを考えていたんですが、このパッチみたいにしてもいいかも。

More ...