β変換 その3 - Scheme VM を書く
現在の実装では中間表現の時点でローカル変数の参照位置を決定している。
例えば
(let ([a 0]) (let ([b 1] [c 2]) a ; a は (1, 0) の位置 b ; b は (0, 0) の位置 c ; c は (0, 1) の位置 ))
(n, m) は
- n は現在の環境から見て何番目の環境か?(環境=letだと思うと分かりやすい)
- m は let の変数の中で何番目か?
を意味する。
でもβ変換の結果、let がなくなる場合がある。するとこの (n, m) をずらしてあげないといけない。
これは実装が面倒。
なので (n, m) の位置計算をコンパイル直前に遅延させることにした。(set! も同様)
残る todo
- n, m 計算遅延による不要コードの削除
- collect free が正しく動くように遅延させる
- let の削除