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 なんですが (以下略