next up previous
Next: 8.3 無限の ExtentをもつContinuation Up: 8 Continuation(継続) Previous: 8.1 Call/CC

8.2 Call/CCの例

Call/CCには,1つの引数をとる手続きを引数として与えます.

==> (+ 1 (call/cc (lambda (cc) (+ 20 300))))

321
ここでは,(lambda (cc) (+ 20 300))の計算結果がCall/CCの 結果となります. これは,CommonLispで,

<cl> ((lambda (val) (+ 1 val)) (+ 20 300))

321
と同じ扱いになります. もし,Call/CCに渡された計算手続きの引数が手続きとして 実行された場合には,その手続きの引数の計算結果が call/ccが呼ばれた時点のcontinuationに渡され, そのcontinuationにその計算結果を渡した結果が (+ 1 (call/cc ...))の結果として返ります.

==> (+ 1 (call/cc (lambda (cc)
                      (+ 20 (cc 300)))))

301
(lambda (cc) (+ 20 (cc 300)))では,(cc 300)という 式を実行しており,この300がcall/ccの結果として返ります. これは,CommonLispでは,

<cl> ((lambda (val) (+ 1 val)) 300)

301
または,

<cl> ((lambda (val) (+ 1 val))
       (catch 'cc
           ((lambda (v) (+ 20 v))
              (throw 'cc 300))))

301
と同じ扱いになります.

generated through LaTeX2HTML. M.Inaba 平成18年5月6日