β変換 その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 を削除しつつ初期値を生かす作りにします。
という実装を今からやります。