Next: 8.4 Catch としての使い方の例
Up: 8 Continuation(継続)
Previous: 8.2 Call/CCの例
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日