軽量let その4 - Scheme VM を書く

昨日 3imp のごく一部を和訳したら方法を思いついた。やっぱり英語を眺めているだけで余計に脳みそ使っているんだな。

整理

  • let1 a (lambda () b) 問題に関しては解決方法が見えてきた
    • (lambda のコンパイル時に free 変数として locals( =( (a) ) も考慮して free 変数用にコンパイルする
    • REFER_LOCAL 0 1 ARGUMENT CLOSURE のような感じ
      • REFER_LOCAL / ARGUMENT は free 変数の push。
      • lambda 内では b は REFER_FREE 0
  • ENTER の前と後どちらで ARGUMENT を積むか
    • 先に積んでおかないと frame のサイズにアクセスできない
    • 現在は正しいつみかたになっているが refer 1 0 とコンパイルされてしまうのがおかしい
    • 直した
  • 難しい局面は脱した
    • [ok]2種類の free variables の説明を加える
    • [OK]stackvm37を消す
    • [OK]テストを追加
    • [OK]テストを通せないものを吟味
  • wiki が動くかどうか?
    • 動いた
    • 最適化済みのコードも動く