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のコメント参照されたし。