[SikiLanguage] [式鬼言語航海日誌] 2007-09-10
2007/09/10_000000ちょっと考えてみたんですけどね。
「なンのことだい?」
Fiberの件で、『Fiberは元のプロセスからは切り離されます。戻り値はFiber自身が持っていて、呼び出し元のプロセスには戻しません』としている部分です。これはこれで一理ありますけど、プロセス側でFiberの結果を取り出さなくてはいけないとなるとちょっと面倒ですね。
「そりゃそうだ。遣りっ放しにできないからね」
普通なら呼び出し元のプロセスとFiberの間に継続の関係を用意して、Fiberの戻り値を元のプロセスで受け取るようにするところかと思いますが、これだとFiberと呼び出し元のプロセスとの依存関係が強くなってしまいます。
「まあ、それが普通だからね」
でも、せっかくFiberで独立性を高くしたのですから、それは避けたいところです。
なら、Fiberの引数として呼び出し元のプロセスを参照できるようにすればいいんじゃない? というアイディアを思い付きました。そうすれば、Fiber側で必要に応じて戻り値を元のプロセスに戻すかどうかを決めることができます。
つまり、Fiber .executeするときは、その第一引数として呼び出し元の継続を渡すようにしました。
「ふうん?」
簡単な例を挙げると、
{!'test'}.execute
のFiberが実行されるときは、その第一引数としてRootが渡されるということですね。
「Rootに戻したい時は、第一引数のスタックに値を積む、つうことか」
はい。こんな感じにします。
{!'test' ..pack}.execute
あと、Fiberに簡単に値を渡す方法が無いのは不便なので、引数を設定するとFiberに渡されるようにしました。
これも昨日の例をベースにして
{!'test' ..append} 'test2' ..execute 'test3' ..execute
といった感じです。
ここでは
- 一回目の..executeのメッセージによって、Fiberが(Root, 'test2')という引数で実行される。
- 二回目の..executeのメッセージによって、Fiberが(Root, 'test2test3' 'test3')という引数で実行される。
という挙動になります。
「まあ、何というか……判り辛いねぇ」
また、渡される継続は呼び出し元の継続なので、
{!{!'1' ..append ..pack} '2' ..execute ..append} .execute
というソースの場合、内側のFiberには一つ外側の(呼び出し元の)Fiberが第一引数に渡されます。
ですので、Fiberの中で実行される..packはRootではなく外側のFiberに結果を押し込みますので、
Root::tail (Root) (外側のFiber) (外側のFiber)::tail (Root) (内側のFiber) '21'
という状態になります。
制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)