あらすじ:オレオレ実装の coroutine は、実は semi-coroutine だったという ことが判明。 http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20070622#p01 http://www.jucs.org/jucs_10_7/coroutines_in_lua/de_Moura_A_L.html Win32API の Fiber なんかは symmetric coroutine ってことになるのかな。 -- libpcl では呼び出し側が call し、呼ばれる側が resume なり exit なりで制御 を返しているのに対して、Lua とかは呼び出し側が resume で、呼ばれる側は yield なのだな。 一発目の呼び出しも resume なのは個人的に奇妙に感じられるけど、create した 時点で一度中断されているものと考えれば受け入れられるか。 -- yield というキーワードがよく分からない。制御権を'譲る'他に、値を'産出'す る意味合いもあるような気がする。 python のジェネレータの例はモロにそれっ ぽい。 そんなこんなで、yield キーワードを選択する場合、戻り値を返せるようにしな ければならない気がするけど……。呼ばれる関数が無限ループでないとき、関数 を抜けると、どうなるのか。どういう挙動を示すべきなのか。 yield が戻り値を返せるとなると、coroutine が終了したことを知るためには、 それ以外の手段を用いる必要がある。 Lua では coroutine が終了する場合 yield と同じ挙動を示すらしい。終了した にも関わらず resume を掛けるとエラーになるとか。 via http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/30969 -- オレオレ実装に yield を盛り込むとしたら、とりあえず coroutine_t にフラグ 変数を仕込んで、終了時に立てる方向かなぁ。 オレオレカーネルももうちょっと弄って形にしたいが、そちらに回す時間がなか なか取れない。