ささだです。

Yusuke ENDOH さんは書きました:
> 長文失礼します。Lua と Modula-2 をちょっとだけ試してみたので報告します。
> はじめての Lua と Modula-2 なので間違いがあったらごめんなさい。
> 検証したコードは末尾に載せます。
> 
> 
> Lua の coroutine は semi-coroutine で、coroutine 間に親子関係がありました。

 うう、そういえばそうでした。

> 実行を移すコマンドが二種類 (resume と yield) あります。
> resume で他の coroutine を駆動し、その coroutine が yield するのを待ちま
> す。
> resume は親から子を、yield は子から親を駆動する感じです (親は子を選べま
> すが、
> 子は親を選べません) 。
> coroutine が終了すると、その coroutine が yield したのと同じ動作をしまし
> た。
> 親子関係を壊すような遷移 (子から親を resume する) はエラーになりました。
> 終了した coroutine を resume してもエラーでした。

 Pythonと同じですね。

> Modula-2 の coroutine は純粋 (?) な coroutine で、coroutine 同士は対等で
> す。
> 従って実行を移すコマンドは一種類 (TRANSFER) だけです。
> TRANSFER で他の coroutine を駆動します。TRANSFER した coroutine は他の
> coroutine から TRANSFER されるまで絶対に動きません。
> coroutine が終了するとプログラムごと終了しました。
> 
> Lua 式と Modula-2 式のどちらがいいかは一長一短だと思います。

 はい。


> 1.9 の Fiber は Lua と Modula-2 の中間 (やや Modula-2 寄り) にいる感じ
> でしょうか。coroutine 終了時に yield するのは Lua っぽいですが、
> 実行を移すのが 1 種類だけのは Modula-2 っぽいです。

 そのとおりです。その意図で作りました。


> Lua は resume と yield の区別によって coroutine の親子関係が保証されてお
> り、
> coroutine の終了時の挙動 (親に戻る) が関数呼び出しっぽくてわかりやすいで
> す。
> Modula-2 は親も子もなく実行はただ一本で、それが途切れたら全部終わり、と
> いう、
> 乱暴な挙動ではありますが、これはこれで筋が通っていると思います。
> 1.9 の現状の Fiber はこのあたりが中途半端なので prev が変なところを
> 指している感じがします。

 中途半端ととるか、Ruby らしいいいとこ取りととるかは人による
感じでしょうかね。「親子関係をもったような何か」もやりやすい
し、「対等な関係」を実現することも可能、というように作りました。

 Lua や Python のように、機能を制限しちゃったほうが、やっぱり
幸せな人は多い気がしますねぇ。うーん、どうしようかなぁ。その場
合は、Fiber という名前は変えないといかんな。


> あと噂では、Simula は Lua 式と Modula-2 式の両方の機能を提供しているらしい
> (しかしそのせいで非常に複雑な実装になっているらしい) です。

 Siumula は調べてませんでした。これは興味深いですね。両方の機
能を、ってのは今の Fiber みたいなの、ということではないんです
かね。

------

 ちょっと、コンストラクタによって上記意味が変わるのはどうだろ
う、と考えてみたんですが、それはそれでわかりづらいですよねぇ。

 他の言語を見てみると「Fiber(のようなもの)が終わる」ってい
うのは「例外的な操作」なので、「気をつけてね」でもいいような気
はします。

-- 
// SASADA Koichi at atdot dot net