http://community.schemewiki.org/?call-with-current-continuationからのコルーチンの次の例を見ています。
(define (hefty-computation do-other-stuff)
(let loop ((n 5))
(display "Hefty computation: ")
(display n)
(newline)
(set! do-other-stuff (call/cc do-other-stuff)) ; point A
(display "Hefty computation (b)")
(newline)
(set! do-other-stuff (call/cc do-other-stuff))
(display "Hefty computation (c)")
(newline)
(set! do-other-stuff (call/cc do-other-stuff))
(if (> n 0)
(loop (- n 1)))))
余分な作業:
;; notionally displays a clock
(define (superfluous-computation do-other-stuff)
(let loop ()
(for-each (lambda (graphic)
(display graphic)
(newline)
(set! do-other-stuff (call/cc do-other-stuff)))
'("Straight up." "Quarter after." "Half past." "Quarter til.")) ; point B
(loop)))
(hefty-computation superfluous-computation)
call/cc を初めて使用する場合、コンテキストはどのようなものになるはずですか? コンテキストとは、callcc のジャンプの結果、どこに「戻る」べきかということです。
私が理解していることから、最初に call/cc を呼び出すと、do-other-stuff は本質的に余分な計算のコードを実行し、set の直後のポイントにジャンプするプロシージャになります! (ポイントA)。2 回目は、「ポイント B にジャンプ」動作を「ポイント A にジャンプしてコンテキストを実行するか、ポイント A に続く任意のコード」をラップします。これは正しいです?
セットの場合、このコードは機能しないようです。実際に起こりました。それともセットですか!このコードが機能するために必要ですか?
何が起こっているかを視覚的に表現することは本当に役に立ちます。