β変換 その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 をエラー出力する

で正しい動作が得られているのかを検証する。