Gauche > Archives > 2012/12/31

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