空想犬猫記

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

多態な参照剥がし

現在のetolispでは値はシンボルも含めて全て Value クラスを派生させて作っている。シンボル名の解決に参照剥がし演算子が使えれば,Lisp上での参照剥がしとC++での参照剥がしが同じメタファーで実現できてカッコいいなあ,と思ってたんだけど

virtual const Value& operator * () const { return *this; }

の多態がうまく動かなかった。なんか制限があるんだっけ*1。結局

virtual const Value& entity() const { return *this; }

という名前にした。こちらの方がむしろ分かりやすくて良いかも。たとえば,(+ a b) は,C++ソースコード上では

pValueA->entity() + pValueB->entity()

みたいな感じで実行されて,自動的にシンボルを解決して適切な Value 同士が足しあわされる。なんかオブジェクト指向〜っていう雰囲気が漂ってていい感じだ。

*1:#追記:たぶん,auto_ptr を使ってたのが原因で,*pValue ではなく,*pValue.get() としなければならなかった。しかしこれだとあまりかっこ良くないので,entity() で結果的によかったと思う。というわけで何かの制限があるわけではないと思います。