β変換 その1 - Scheme VM を書く

初期値が $const なローカル変数参照は、その変数が set! されないことが保証されれば、値で置き換えることが出来る。
この判定に必要なものは

  • set! されるかどうかの情報
  • 初期値が const かどうかの情報
  • LOCAL_REF から上記2つの情報にアクセスできること

の3つ。

まず LOCAL_REF の IForm を

#($LOCAL_REF n m lvarへの参照)

のように定義。


続いて lvar は

#(symbol名 set!されるか? 初期値iformへの参照 参照カウント)

のように定義する。

これらの情報を使い

($LET ((a (1) ($CONST 101)))
  ($LOCAL_REF a 0 0))

=>

($LET ((a (0) ($CONST 101)))
  ($CONST 101))

のように変数参照を置き換えることに成功した。
a の隣の (0) は参照カウントである。

さて残りの todo は以下の通り。

  • 参照カウントの lvar を削除すること
  • lvar がなくなってしまった let を削除すること
  • 初期値が LOCAL_REF の場合の置き換え


しかし Scheme で参照を意識してコードを書くのは久しぶりだ。