etolisp 進捗(番外編)
メッセンジャーで別れ話をしながら defmethod の実装をしていたら,いつの間にかよりが戻っていた件。
その分ソースコードはこんがらがった。
method の specialization の仕組みは,かなりいい感じで実装できた。generic function のインフラは完成。あとはdefmethodクラスそのものの実装を残すのみ。defunやdefmacroの実装と共通化するために,構文木の解析部分,および lambda 周りを改良。method は呼び出し前に型をチェックする必要があるから,通常の関数呼び出しとは,引数の評価のタイミングが異なるため。
それと同時に parser 周りを少し整理した。具体的には
:initarg :allocation
のような「:」で始まるシンボルを,専用の型のシンボルとしてパースするようにしたのと
&body &key &optional &rest
を enum としてパースするようにした。少しだけ後々の扱いが楽になる。
defmethodはC++のオーバーロードと同じようにオブジェクトの「型」で specialization する実装にしたが,例によって実装し終わったあとで,赤い本にこんな記述を発見してしまった。
Methods can even be specialized on individual objects, as determined by eql
(defmethod combine ((x (eql 'powder)) (y (eql 'spark)) ...)
うーむ。無視しようか…。まてよ,クラスオブジェクトもオブジェクトインスタンスもポインタ値で specialization するようにすれば,なんとかなりそうな気がするぞ。後でやってみよう。