継続 (continuation)


Scheme には、継続(continuation) と呼ばれるコントロール制御の一種で、 大域的なコントロール制御が行うことができます。 たとえば、C の set jump / long jump や、Java の例外処理等もこの枠組で処理できます。

とりあえず、例を紹介します。


(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