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ジャンプであっても、
関数呼び出しと全く同じように表現されるところがよいです。

このブログ記事について

このページは、yuchが2006年5月20日 23:24に書いたブログ記事です。

ひとつ前のブログ記事は「named-let」です。

次のブログ記事は「鯖復活」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01