Next: 10 continuationの例
Up: 9 Continuation操作機構をもつSchemeインタプリタ
Previous: 9.4 組み込み基本関数の定義
Call/ccは,lispの関数としてcall/ccを作り,
そのLisp関数の実体をcall/cc手続きに登録します.
現在のContinuation(cc:current-continuation)と計算手続きcomputation
を引数としてもらいます.
computationは,schemeの計算手続きになりますが,
その計算手続きは,lambdaで作られた手続きか,
組み込み手続きになります.
これらの手続きの実体は,2つの引数をもらうLispのクロージャです.
2つ目以降が中で実行するLisp手続きへの引数で,
1つ目がそのLisp手続きを実行した後の結果を適用する
Continuationになります.
そこで,Call/ccは,渡されるcc と,ccをlispの1引数手続きとみなして
実行するというLispのクロージャの2つをcomputationに渡して実行することを
行います.
(defun call/cc (cc computation)
(funcall computation cc
#'(lambda (cont val)
(funcall cc val))))
schemeインタプリタの初期化ルーチンに,call/cc
の定義を追加します.
(defun init-scheme-interpreter nil
(set-global-var! 't t)
(set-global-var! 'nil nil)
(set-global-var! 'pi pi)
(set-global-var! 'get (symbol-function 'get))
(set-global-var! 'put
#'(lambda (sym key value)
(setf (get sym key) value)))
(mapc #'init-scheme-proc *scheme-procs*)
(init-scheme-macros)
(set-global-var! 'call/cc #'call/cc)
(set-global-var!
'call-with-current-continuation
#'call/cc)
)
generated through LaTeX2HTML. M.Inaba 平成18年5月6日