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 が出てきますが、ここまでの理解で大丈夫なのかなぁ。明日は待機で一日勉強予定なので、今日のエントリをまずレビュー予定、とゆーコトで。