#こんにちは。Scheme初心者でオライリーの『プログラミングGauche』を読んでいるものです。
#いらっしゃいませ
#19.8節のコルーチンの継続の動作が理解できません。そもそも、継続そのものの理解があいまいです。字面のコードにgotoするのか、フローの流れでgotoするのか。最初の例の場合、まずbody ...の所で(print 'one)して、その次に(yield)を呼び出すわけですが、このyieldの中でreturnを呼びだして、((dequeue! *tasks*))で
#*tasks*に登録されたcontを一つ呼び出すときに、制御が(call/cc (lambda (return) .... body ... に移って、再びbody ... の(print 'one)が呼び出されるということはないのでしょうか。日本語がめちゃくちゃですいません...
#yieldはその中で(call/cc (lambda (cont) ...)) となっています。このcontに、「現在のyieldから戻って処理を続ける、つまり(print 'two)から処理を再開する」という継続が捕まえられます。それがenqueueされます。
#(define (routine) ...) の中に(define (yield) ...)がありますが,
#routineの定義時にはyieldは実行されていない、つまりフローとしては別々であることに注意してください。最初の質問に沿えば、あくまでフローの流れ(実行時の状態)を捕まえるのが継続です。
#なんとなくですがわかりました!(失礼な言い方ですいません)。Common Lisp出身者でdefineの内側にdefineがあるのはなれてなくて。つまり、defineの内側のdefineは実行タイミングが自我うということですか?
#自我うではなくて違うですね
#defineによる定義は実行されますが、定義の中身はlambdaに包まれるのでその時には実行されません。内側の(define (yield) ...) body ... は (labels ((yield (lambda () ...))) body ...) だと思って頂ければ。
#あ、まちがえた。 (labels ((yield () ...)) body ...) ですね。混ざっちゃった。
#ありがとうございます。ところでshiroさんって川合史郎さんでいらっしゃいますか。もしそうだったらそんな人に回答をいただいて光栄です。
#そうです。本を読んでいただいてありがとうございます。