From: SASADA Koichi Date: 2007-06-15T04:22:14+09:00 Subject: [ruby-dev:30991] Re: Supporting Fiber  ささだです。 Yusuke ENDOH さんは書きました: >> 親子関係を利用したプログラミングをしている場合、「親子関係の >> 破壊を起こさなければ」、Fiber#prev が正しく「呼び出し元」を指 >> し示すため、SemiCoroutine のような使い方が可能です。 > > 今の Fiber で「親子関係を壊さない範囲」というのはものすごく > 狭いと思います。coroutine の中で coroutine を呼び出して > suspend を受けるだけで違反してしまいます。  ガーン。その通りでした。ごめんなさい orz これは間抜けだ なぁ。こんな「中途半端」なものは、無いほうがいいですね。思い違 いをしていました。ががっと撤回します。 (*親子関係が破壊されるまで*スタックで親子関係を保持するという 選択肢もあるが、コストにあわないかなぁ)  なんとなく、resume, yield のある、SemiCoroutine クラスを、 Rubyレベルで作るのがいいような気がしてきました。 > g = Generator.new{|g| > g.yield 10 > g.yield 20 > g.yield 30 > } > > Fiber.new do > show g > end.yield > > が何も出力されないというよくわからない挙動をしますが、 > これも Fiber をよくわかってないことが原因の「不思議なこと」でしょうか。  うーん、prev が変なところ指してるのかしらん(あんまり考えて ません) > ちなみに Lua の開発陣?の例の論文によると、semi-coroutine で > coroutine をエンコードできると主張されてました。 > # 補助 coroutine を立ち上げて、TRANSFER するときは全てその > # 補助 coroutine を介して呼ぶ感じです。トランポリン?  ううん、なるほど。 > dynamic-wind についてはお察しの通りよくわかってませんが、例えば > 「ブロックを取るメソッドを書くとき、そのメソッドを使う人が > callcc でブロックの中に飛び込むようなことをしたときの対策が > とれない」ってことでしょうか。  ensure と ensure の逆がうまいこと出来ないってことです。 > ごもっともですが、下手に他の言語で十分練られた設計があるなら > それを盗むのも手かと思わなくもないです。  それにもいくつか選択肢はあるんですよね。 -- // SASADA Koichi at atdot dot net