Next: 9.3 関数呼び出しの実行
Up: 9 Continuation操作機構をもつSchemeインタプリタ
Previous: 9.1 インタプリタのトップレベル
スペシャルフォームごとに,再帰的にinterpを呼ぶ場合には,
そのinterpに渡すcontinuationをccを使って更新し,呼ばない場合には,
渡されているccへ返す値を引数と渡してccを実行するという形に
なります.
quoteは,引数を返すだけなので,その返す値をccに適用します.
lambdaも,クロージャを返すだけなので,その値をccに
適用します.
beginは,第一引数をinterpする形に書いて,第二引数以降を
処理すべきであるというcontinuationをそのinterpに与える形になります.
set!は,第二引数を先にinterpしてから,その結果を第一引数の変数に
代入するので,第一引数に代入を行う処理を行って,そこへ渡された
ccを実行するというcontinuationを第二引数のinterpへ渡します.
if では,条件判断部である第一引数をinterpした後,そのinterp結果に
応じて第二引数か第三引数をinterpに渡すことを行うcontinuationを
作ります.
(defun interp-specialform (name params env cc)
(case
name
(quote (funcall cc (car params)))
(begin (interp
(car params) env
#'(lambda (val)
(if (null (cdr params))
(funcall cc val)
(interp-specialform
name (cdr params) env cc)))))
(set!
(interp (cadr params) env
#'(lambda (val)
(funcall cc
(set-var! (car params)
val
env)))))
(if
(interp (car params) env
#'(lambda (pred)
(interp
(if pred (cadr params)
(caddr params))
env cc))))
(lambda
(let* ((vars (car params))
(code (cons 'begin (cdr params))))
(funcall
cc
#'(lambda (cont &rest args)
(interp
code
(extend-env vars args env)
cont)))))
))
generated through LaTeX2HTML. M.Inaba 平成18年5月6日