とりあえず、例を紹介します。
(define (divider x y cont) ; divider は x, y, と継続 cont を引数にする関数
(if (= y 0) ; (= y 0) の場合は、
(cont 'exception) ; cont に即座に復帰し、返り値は 'exception となる。
(/ x y))) ; それ以外なら(/ x y) を返します
(define (caller x y) ; divider を呼ぶ関数
; call-with-current-continuation は、
; 現在のプログラムの実行状況(continuation)をとりだし、
(call-with-current-continuation
; 引数(この場合ラムダ式)である関数に、そのcontinuation を適用します。
(lambda (cont) ; つまり、先程の continuation は変数 cont に格納された。
(let ((val (divider x y cont))) ; 適用の結果、この式が実行され、
(display "Val:") ; そのまま計算が進みます。
(display val) ; 但し、途中で cont が使われれば、
(newline) ; 即座に cont に復帰します。
val))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> (caller 10 2)
Val:5
5
> (caller 10 0)
now start
exception
99.10.7/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp