call/cc リハビリ (2)

げ。いきなり答えが書いてある。

(* 2 (call-with-continuation-procedure (lambda (* 2 a))
                                  (lambda (cont) (cont (fact 10)))))

と書く代わりに、call-with-continuation-procedure式の返りを待っている続きの計算、つまり(lambda (a) (* 2 a))を自動的に取り出し、call-with-continuation-procedureの第一引数に渡してもらえば簡単になる。それが、call-with-current-continuation、いわゆるcall/ccだ。

使いたい人のための継続入門より引用

ひえー。ちょっと待てよ。先の fact/cps の call/continuation-procedure を使った定義が以下。

(define (fact/cps n cont)
  (call/continuation-procedure cont (lambda (c) (c (fact n)))))

これをそのまま展開したらナニ。

((lambda (c) (c (fact n))) cont)

上記のナニで言うと cont を自動で取り出して渡す、という事ですか。成程ね。

と言いつつも

次のハードルの REPL が出てきますが、ここまでの理解で大丈夫なのかなぁ。明日は待機で一日勉強予定なので、今日のエントリをまずレビュー予定、とゆーコトで。