Scheme Compiler の勉強(36) - closure conversion
「ひとこと言っておくよ。グラフを描かないのが、きみの弱点だ。式をいじることだけがコンパイラじゃない」
『コンパイラ・ガール』より※
さあクロージャ変換だ。結局、lambda 式ってのは一度にいろんなことを行っていて扱い難いからバラそう、という考え。この論文では (closure lvar var ...) という形式を導入して、自由変数を識別できる形式にする。Schem で書く S-式側の処理で、ちょっとわくわくする。名前だけは何度か聞いているので。
ところで、Scheme に「この範囲には絶対に自由変数はないよ、もしあったらコンパイルエラーにして」という構文があると嬉しい気がするのだけど。他のネストした関数を定義できる言語でも同じだけど、「意図せず」(タイプミスとか)自由変数を作ってしまっても当然エラーにも警告にもならない(そういう構文があるとコンパイラを作るのが楽だ)。
tests-2.1-req.scm に詳しい方法が入っていた。これを読みながら進めてみよう。もうベクトルもあるので部品はそろっている、つもり。
参考;
- http://www.memorymanagement.org/glossary/c.html#closure
- The 90 minute Scheme to C compiler
- http://min-caml.sourceforge.net/index8.html