SICP 読み (282) 5.4 積極制御評価器

へろへろなんで控えのみ。ちなみに 5.24 については直前エントリの状態で別途実機確認予定ッス。

問題 5.25

む。これ、思ったより面倒だな。ええと、actual-value で取り出した手続きが primitive か compound かで引数の処理の仕方が違ってくる。てコトは最初に

ev-application
  (save continue)
  (assign unev (op operands) (reg exp))
  (assign exp (op operator) (reg exp))
  (assign argl (op empty-arglist))
  (assign proc (op actual-value) (reg exp) (reg env))
  (test (op no-operands?) (reg unev))
  (branch (label apply-dispatch))
  (save proc)

こうしといて、proc が primitive か compound かで unev を評価するか遅延するかを決めないと駄目なんだろうな。てーコトは、primitive な場合は既存の ev-appl-operand-loop が使えるはず。逆に compound なソレは delay なループが必要か。
compound な場合は引数は eval されないハズなので proc を push する必要ないのかなぁ。既存を生かすのであれば argl に list-of-delayed-args を蓄積すれば、で良いのでしょうか。list-of-delayed-args も評価器に手続きを盛り込むべき??
あ、ev-appl-operand-loop でも actual-value しないと駄目だな。