Scheme コンパイラの勉強(49) - lambda, closure, frame

コンパイルの過程。以下3impに書いていること、そのまま。

lambda

(lambda vars body) は (close vars cbody) へコンパイルされる。body をコンパイルするときは next を '(return) にしておく。
(return) インストラクションは、スタックから最初のフレームを削除し、current environment, current rib, next expression, current stack をリセットする。

application (関数適用?)(とcall/cc)

(fcn arg1 ... argn) は(frame next c)へコンパイルされる。※p.58 では(frame c next) と書いているけど多分間違い。
fcn として引数が1つの (lambda (x) x) を考え、数値 47を渡す ((lambda (x) x) 47) の場合、

(frame 
  (halt)
  (constant 47
     (argument
        (close (x)
           (refer x)
              (return))
                 (apply)))))

(frame) インストラクションは、新規にフレームを作成する。
(constant) インストラクションは、(ここでは 47 を) accumulator にセットする。
(argument) インストラクションは、accumulator の値を current value rib に追加(単なる cons) する。
(close) インストラクションは、クロージャを生成し、accumulator にセットする。
(apply) インストラクションは、 accumulator のクロージャを current value rib に対して適用する。