なんとなく掴みかけてきた。
continuation は「continuation が呼ばれると、continuation が作られた call/cc の外に、引数を call/cc の返り値としてジャンプする」というのが正しい振る舞いです。
gosh> (+ 5 (call/cc (lambda (cont) (* 10 10))))
105
gosh> (+ 5 (call/cc (lambda (cont) (cont 10))))
15
gosh> (+ 5 (call/cc (lambda (cont) (cont (+ 1 2 3)))))
11
次にやる処理を包み込んでひっくり返すというイメージよりは、単純にセーブポイントと考えたほうがよいのかな。call/ccの返り値としてジャンプ
gosh> (define cont #f)
cont
gosh> (+ 5 (call/cc (lambda (c) (begin (set! cont c) 10))))
15
gosh> (cont 30)
35
gosh> (cont (+ 1 2 3))
11
さてcall/ccを通って何かが出て行くというイメージだと、二枚がけとかできそうな感じなのでやってみる。
gosh> (+ 10 (call/cc (lambda (d) (begin (set! cont2 d)
(+ 5 (call/cc (lambda (c) (begin (set! cont c) 10))))))))
25
セーブポイントはcont2とcontの二箇所。cont2をよべば(+ 10 cont2の返り値),contを呼べば(+ 10 (+ 5 contの返り値)が評価されるはず。
gosh> (cont 3)
18
gosh> (cont2 3)
13
おーきた。call/ccからジャンプしてきた。なんつーかperlのデバッガで作業してるみたいな感覚だ。