/var/log/messages

debugging with sixth sense

EoPL の 2.3.2 と 2.3.3 控え

環境を操作する実装について。纏めるのがやや微妙。

interface は決まってますが、実装として

  • constructor は手続きオブジェクトを戻して apply-* ではその手続きを eval する方式
  • constructor は abstract syntax tree を戻して apply-* ではその型によって必要な手続きを適用する方式

という形になってます。

Procedural Representation

この方式で面白いのは empty-env とか extend-env という constructor に渡している引数が実質的にオブジェクトの属性になっている、という事かなと。closure というソレを上手に使っている例、と言えば良いのかどうか。

また、apply-env ではコンストラクタが作った手続きオブジェクトを正に apply すれば良いだけなので非常に簡潔です。

Abstract Syntax Tree Representation

とは言え、こちらの方法の方がよりオブジェクト指向なのでしょうか。abstract syntax tree なオブジェクトは手続きは持たない属性のみのオブジェクトです。empty-env や extend-env はこれらのオブジェクトに渡された引数をセットしているのみ、と言っても過言ではないと思います。

逆に apply-env ではそのオブジェクトの型に沿って定められた手続きを適用していきます。この方式だと constructor に渡される引数は厳密に検査されるので安心と言えるかもしれません。

Comments