空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

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 するようにすれば,なんとかなりそうな気がするぞ。後でやってみよう。