next up previous
Next: 8.4 Catch としての使い方の例 Up: 8 Continuation(継続) Previous: 8.2 Call/CCの例

8.3 無限の ExtentをもつContinuation

call/ccにおけるcontinuationは,無限の extentを持ちます. call/ccに渡す関数手続きの中で,continuationを保存すれば, それはcall/ccから抜けた後も利用可能です. つまり,ccを大域変数に保存し,その大域変数を後で呼び出せば, その保存されたcontinuationの計算を実行することになります.


==> (+ 1 (call/cc (lambda (cc)
                      (set! old-cc cc)
                      (+ 20 (cc 300)))))

301 
==> (old-cc 500)

501 
==> (old-cc 200)

201
というように,call/ccが呼ばれた時点のcontinuationが old-ccに代入されており,(old-cc 500)とした場合に, (+ 1 (call/cc ...))の計算の継続がなされ,501が計算結果と して返されます.(old-cc 200)としたらば201となっています. しかし,CommonLispでは,


<cl> (+ 1 (catch 'tag (+ 20 (throw 'tag 300))))

301

<cl> (throw 'tag 500)

Error: there was no pending CATCH for the tag TAG
というように,catchの外側から,throwを呼び出すことは できません.これは,call/ccのcontinuationは, 無限のextentを持っているのに対して,throw/catchのタグは 動的なextentしか持たないからです.

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