β変換 その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 で参照を意識してコードを書くのは久しぶりだ。