next up previous
Next: 10 continuationの例 Up: 9 Continuation操作機構をもつSchemeインタプリタ Previous: 9.4 組み込み基本関数の定義

9.5 Call/CCの定義

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日