正直日記



2009/03/17

_ セミ・コルーチンのメソッド名とか考
あらすじ:オレオレ実装の 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 にフラグ
変数を仕込んで、終了時に立てる方向かなぁ。

オレオレカーネルももうちょっと弄って形にしたいが、そちらに回す時間がなか
なか取れない。

最新
2010 | 01 04
2009 | 01 02 03 04 05 06 07 09 10 11 12
2008 | 01 02 03 04 05 06 07 08 09 10 11 12
2007 | 02 03 04 05 06 07 08 10 11 12
2006 | 01 02 03 04 05 06 07 08 09 10 11 12
2005 | 01 02 03 04 05 06 07 08 09 10 11 12