β変換 その6 - Scheme VM を書く
単純な例で不要 let が削除されるようになった。
(let ([a 0]) a) (let ([a 0] [b 1]) b)
うまくいかない例
(let ([a 0] [b 1]) a b)
を調べよう。→ $SEQ の body の中を最適化していないからだった。
(let ([a 0] [b 1] [c (func 0)]) a b) ; => 初期値は $SEQ の先頭へ ($SEQ (($CALL ($GLOBAL_REF func) (($CONST 0))) ($SEQ (($CONST 0) ($CONST 1)))))
(let ([a 0] [b 1]) (+ a b)) ; => ($ASM NUMBER_ADD (($CONST 0) ($CONST 1)))
大体動くようになったので
- 大きめのコードで動かしてみる
- 削除された let をエラー出力する
で正しい動作が得られているのかを検証する。