クロージャ変換

プログラムを作ってクロージャ変換の意味が分かった(かも)。基本的に明示的に表れる引数はレジスタに載ることが前提なのでクロージャ変換とは関連がない。クロージャ変換でクロージャに組み込まれるのはその関数が宣言された上の表記のバインドされた変数を一時的なスタックに入れてやり、呼び出す。呼び出された側は、バインドされている変数を暗に受け取るのではなくて、クロージャを通して受け取る。受け取った後はレジスタに載ったのと同じなので、一時的なスタックは破棄する。

注意しなければならないのは、なにを積むかという事。いま、読んだところのコンテキストではなく、呼ばれた側の表記上のバインドされた変数の値。

何回転の課自分でもわからなくなったよ。

まぁ、無駄な copy-tree とスタックをやたら使うバージョンができたよ。ちゃんと末尾呼び出しにしないとなぁ、、、、あと、プレースホルダーを使ったコールバックも必要だな。ほかのところでは実現したんだけどね。ということで、今まで作ったものを統合すれば、中間言語まで落とすことができるはず?

シンタックス・シュガーに対応してない。

ところで、

(defun func (a) (if a (defun func0 () (print "func0")) (defun func1 () (print "func1"))) (list #'func0 #'func1))

こんなことできるか?