ささだです。

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