Gauche > Archives > 2013/01/01

2013/01/01 13:55:06 UTCiyanaha
#
以前質問させてもらったものですが、やはりわからないので再度質問させていただきます。
#
;; コルーチンの定義構文
#
(define (yield) (call/cc (lambda (cont) (eneque ....
#
の所で、次ページのthreeを呼び出しの中で,
#
(print 'one) (yield) と呼び出したときに,
#
先ほどの変数contはどのような手続きに拘束されすか。
#
できれば、コードの形で示していただきたいです。
2013/01/01 14:02:53 UTCshiro
#
;; yieldの中のcall/ccは(yieldの中には他にやることが残ってないので)
;; 「yieldから戻った後」の処理を捕まえます。コードで示すならcontの中身は
;; こんな手続きです。
(lambda (val)
  (print 'two)
  (yield)
  (print 'three)
  (yield)
  (let lp ()
    ...以下ループ...))
#
私は落ちますが疑問点があれば書いておいて下さい。エディタに書いてpasteすれば上のように複数行書けます。
2013/01/01 14:05:22 UTCiyanaha
#
解答ありがとうございます。字面だけ追ってくとcontは(define (yield) ... の中にあって、contを呼び出すとここに値が返されるように思ってしまうのですが
2013/01/01 18:45:32 UTCshiro
#
そうです。contを呼び出すと(define (yield) (call/cc ....)<= このcall/ccから戻ってきたように見えるわけですが、yieldはこの後に処理が無いので、ここのcall/ccから戻ることはすなわちyieldから戻るのと同じです。これが例えば (define (yield) (call/cc ...) (print "Came back to yield!")) となっていれば、contを呼ぶとメッセージが表示されると思います。