大域脱出

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!!」が出力されない。