Lisp Scheme Part40 [転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
210はちみつ餃子 ◆8X2XSCHEME 2015/09/05(土) 21:46:57.65ID:H6CjR/B1
例えば RnRS の call/cc を使ってこういうのを書いたとする。

(define (foo x)
(+ 3
(call/cc
(lambda(cc)
(if (> x 3) (cc (+ x 1)) x)))))

(display (foo 1)) (display (foo 5))

継続とは何かというのを綺麗に説明するのは難しいけど、
「残りの計算」という言葉で説明するのが一般的だね。
この例でいえば call/cc を呼出された後にするはずの計算、
すなわち「 (+ 3 」が変数 cc に入っている継続。
call/cc を呼出している外側全てと言い換えてもいいかもしれない。
(字句上の外側ではなくて実行時の外側。)
で、 >>209 の言うところの call/cc (名前がまぎらわしいから
ここでは call/cc* と変える) は残りの計算を陽に引数として
渡すバージョンということだと思う。
最初の例を call/cc* で書き直すと

(define (foo* x)
(call/cc*
(lambda(x)(+ 3 x))
(lambda(cc f)
(if (> x 3) (cc (+ x 1)) (f cc x)))))

(display (foo* 1)) (display (foo* 5))

となる。
「(+ 3」の計算を (lambda(x)(+ 3 x)) というクロージャにして渡しているのが
わかるかな。

■ このスレッドは過去ログ倉庫に格納されています