vieweditattachhistoryswikistopchangessearchhelp

EQL スペシャライザ

eql specializer 。CLOS総称関数において、メソッドを、特定のインスタンス特異的なメソッドとして登録するための機構。Ruby特異メソッド に相当し、その導入に影響を与えたと推察される。通常、(パラメータ クラス)とクラスを指定するパラメータスペックの代わりに、 (パラメータ (EQL インスタンス)) と綴ることで利用できる。CLOS のサブセットで STklos 系統のオブジェクトシステムを搭載した Gauche にはこの機能はない(※ STKlos 系統だらかというわけではなく、今の VM でうまい実装が見つからないからとのこと)。
--sumim

サンプルスクリプト

(defmethod is-zero ((self (eql 0))) T)
(defmethod is-zero (self) NIL)
一行目で、総称関数 is-zero に、そのパラメータを EQL スペシャライザによってインスタンス「0」のみに限定したメソッドを登録している。二行目では、あらゆるパラメータに対して NIL を返すメソッドを登録している。この結果、is-zero 呼び出しの際、パラメータが 0 のときは一行目に定義されたメソッドが起動して T が返る。それ以外は二行目のメソッドが起動して NIL が返ってくる。
(is-zero 0)
==> T
(is-zero 1)
==> NIL
(is-zero "a")
==> NIL
(is-zero (lambda (x) (+ x x)))
==> NIL
--sumim

このページを編集 (1463 bytes)


Congratulations! 以下の 3 ページから参照されています。

This page has been visited 5339 times.