遠藤です。

>  これは、「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 <mame / tsg.ne.jp>