β変換 その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 の削除