大域脱出
call/ccを利用した大域脱出の例。今までcall/ccでウダウダ考えていたのでさすがに挙動の理解は簡単。
ただし、継続と絡めて説明しろと言われても無理。そういう意味ではcall/ccは全く理解できていない。
指定したラベルを含むS式から脱出するマクロblockを定義してみる。
(define-syntax block (syntax-rules () ((_ escape body ...) (call/cc (lambda (escape) body ...)))))
アンダースコアの説明が見当たらなかったけど、Scheme 入門 15. 構文の定義によると、マクロ名を表すらしい。つまり、次のように書いたのと同じなわけだな。
(define-syntax block (syntax-rules () ((block escape body ...) (call/cc (lambda (escape) body ...)))))
使ってみると
gosh> (block escape-top (block escape-1st (block escape-2nd (escape-1st 1) ;escape-1stのレベルから脱出 (print 'NG!!!)) (print 'NG!!)) (print 'OK)) OK #<undef>
コメントの箇所でescape-1stのレベルから脱出しているので、「NG!!!」と「NG!!」が出力されない。