3imp 読んでみる (9)
連投ですな。とりあえず現時点の理解とインストラクションを振り返り。
とは言え VM がどうインストラクションを評価するか、な世界なのか。とりあえず着目しておきたいのは call/cc と application か。
とりあえず試験追加してみるか。
(test* "(compile '(p 1 2 3) '(halt))" '(frame (halt) (constant 3 (argument (constant 2 (argument (constant 1 (argument (refer p (apply))))))))) (compile '(p 1 2 3) '(halt)))
これは勿論パス。このリストはどう評価されるのかなぁ。push されていくっぽい。なるほど current rib (??) に cons されてって p の束縛を accumulator にセットして apply するんだ。大体な線はイメージできてるな。
って call/cc 見てて感じたのは argument というインストラクションは理解が微妙かも。あ、末尾呼び出しについては結構きちんとイメージできてる感じです。
ちょっとだけ
VM の定義
(define (VM a x e r s) (record-case x [halt () a] (以下略
record-case 的には halt にマッチしたら
(record () () a)
これは単純に
(apply (lambda () a))
というナニ。これは例えば
(constant 1 (halt))
というインストラクションだと 1 が accumulator にセットされてそのままそれが戻るのか。今日はスデに無理ですが、VM とそれにマツワる手続きを明日で試験できれば次は stack-based なんですが (以下略