From: Yusuke ENDOH Date: 2007-06-09T10:38:00+09:00 Subject: [ruby-dev:30941] Re: Supporting Fiber 遠藤です。 >  これは、「Fiber が終了した場合、どうするか」という問題になり > ます。ここは、いくつか選択肢があるんですが、現在では > [ruby-dev:30827] に書いたとおり、 げ、また読み落としてました。失礼しました。 > となっています。どうするとよいと思いますか? 一般的な意味にあわせるのが一番いいと思います。 不勉強ながら私は fiber や coroutine 関連の論文や他言語の仕様を 読んだことがないので、その答えはわかりません。すみません。 私が [ruby-dev:30924] の挙動に違和感を覚えた理由は Fiber の意味を callcc の単純なラッパとして理解していて、それと同じ挙動を期待したからです。 つまり、[ruby-dev:30924] は以下とほぼ等価かと。 f = proc do |prev| p 1 prev.call p 2 end f2 = proc do |prev| callcc {|current| f.call(current) } end callcc {|current| f2.call(current) } # 脳内変換規則 # Fiber.new ==> proc {|prev| ... } # Fiber#yield ==> callcc {|current| self.call(current) } しかしこの変換規則だと Fiber を導入する意味がほとんどなさそうなので こちらの方が一般的に採用されているとか、便利な例が多そうだということなら、 私の違和感は無視してください。 あ、あと、呼び出しを Fiber.new { ... }.yield でくくるだけで挙動が変わる 関数が定義できてしまうことに抵抗があったというのもあります。 そういう黒魔術は callcc だけでいい、みたいな。 def foo Fiber.new do p 1 Fiber.prev.yield p 2 end.yield end # Fiber.new do # 何かいろいろやる foo # 何かいろいろやる # Fiber.new でくくっていると忘れた頃に p 2 が実行される # end.yield -- Yusuke ENDOH