Scoping

今さらな事に気がついた。syntax-rules は programmer の視点に lexical scoping をもたらすもので、処理系からすれば lexical scoping を破るものだとばっかり思ってたけど、完全にはそうでもない。一つの form にその form 自身とは違う環境で解決される変数参照を含められるという点では確かに破れてるけど、それは単にその form を包含する innermost な frame で解決されないというだけで、form の評価環境に積んである frame を手繰っていけばその lexical scoping 破りな変数が要求する frame に辿り着ける。Syntax は first class じゃないもんね。

めも: [anthy] 「含めれる」は出るけど「ふくめられる」が出ない。助動詞の扱いが変? っていうか「含める」しか日本語的には正しくないんだっけ?

これを利用すれば実装が随分簡単 + 効率的になるけれども、それを正しく行うにはプチ compiler を書くことになる。SigScheme での syntax-rules の問題はこれに尽きる。展開回数を抑えようとすると、与えられた任意の form (subform を持つかもしれない) に含まれる全部の macro (再帰するかもしれない) を 1 pass で展開するのが殆ど不可避になってくる。そうすると compiler のような traverser を書くことになる。しかしそんな事をするなら compiler 型にした方が手っ取り早い。そうすると SigScheme である価値が無くなる (ほぼ全部書き直しになるから)。

如何にして compiler 相当の機能を書く事無く、しかも展開回数を抑えて実装するか。