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

ローカル変数参照を値で置き換えると let が不要になる場合があります。

(let ([a 0])
    a)

;==>ローカル変数参照置き換え

(let ([a 0])
    0)

;===>letの削除
0 ;; こうしたい!

let の削除

基本的には let で使われている変数の、参照カウントが 0 であれば let を削除できそうですが。
以下のように変数 a の参照カウントが 0 でも let を削ってはいけない場合があります。

(let ([a (func 3)])
   4)

単純に let を削ってしまうと (func 3) が実行されず、 func に副作用がある場合まずそうです。

let を削るならば

(begin (func 3) 4)

としてあげるのが良いでしょう。

不要 let 削除の条件

削除の条件を考えます。
まず全ての変数の参照カウントが 0 で、set! されないこと。


次に変数の初期値により分岐。
(1) 変数の初期値が、「ローカル変数参照」「定数」「クロージャ」の場合
初期値に副作用なしとみて、初期値を破棄する。


(2)上記以外
初期値に副作用がありそうなので

(begin 初期値を並べたもの letのbody)


のように let を削除しつつ初期値を生かす作りにします。
という実装を今からやります。