call/cc使ってみる4

前回(id:yagiey:20100424:1272115876)の続きっぽいけど...
まず、コメントを受けて、

(and (begin (display 'a) 10)
     (call/cc (lambda (c) (begin (set! cont c) 10))))

の構文andはifへ展開できるので

(if (begin (display 'a) 10)
    (call/cc (lambda (c) (begin (set! cont c) 10)))
    #f)

になる。andよりこれの方がで考えやすいので、これでやっていく。


さて、「継続とは、これから行うこと」って今まで何回も考えてきたのに、

call/cc の中の cont は、「即 return して、引数が call/cc の値」だったのに対し、束縛したものは、「call/cc の値を x にしてλ抽象」。

call/cc 入門 (Coroutine with call/cc) - MAYAH

をそのままやってしまって、contは

(lambda (x)
  (and (begin (display 'a) 10)
       x))

って考えてしまった。
beginはもう済んでしまったことだから継続には含まれないんだよなぁー。

(inc
 (call/cc (lambda (c) (begin (set! f c) 10))))

と同じ要領で考えるならば、contは「なにもしない」ってことになるのかな?
何もせず、さっき求めた結果がifの結果となる。
だから、

gosh> (cont 10)
10

なんだなー。結果の10は、(call/cc (lambda (c) (begin (set! cont c) 10)))の最後の10ではない。
だけど、次の

gosh> (begin (cont 10) (display 'c))
10

がよくわからない。
以前、継続をmapの第1引数に与えた時にも同じ(計算が中断された?)感じになったなぁ。


上のfは「さっき求めた結果をincする」っていう継続になるけど、一方でcontが「何もしない」って結論を出すまでにちょっと躊躇があったけど、これが末尾呼出しとかいうやつなのかな?

違うっぽい?

contは「何もしない」って書いたけど、もうちょっと考える余地があるようだ。
id:yagiey:20100424:1272115876のコメント参照されたし。