call/ccでgoto
継続があるとgotoジャンプができます。
昨日のnamed-letの例を継続による繰り返しで表現してみると、
以下のようになります。
(let* ((loop '())
(i (call/cc (lambda (c) (set! loop c) 0))))
(when (< i 5)
(display i)
(loop (+ i 1))))
>01234
(set! loop c)で継続を外部の変数に束縛しているところがポイント。
で(loop (+ i 1))が評価されると継続loop=cが束縛された位置、
つまり(call/cc ...)の位置に戻ってきます。
継続を保存して、何かして、復元すればループになると。
継続は状態の保存とか大域脱出が主な利用で、
こういうジャンプは多分あまり推奨されない。
gotoジャンプそのものだしな。
ただまぁgotoジャンプであっても、
関数呼び出しと全く同じように表現されるところがよいです。
