Lua を知っていれば Lua の coroutine みたいなものと言えば良く、知らなければ切り替えを自分で(できる/しなければならない)スレッドと言えば良いんでしょうかね。
PI = Object clone PI calc = method( # 正しいπの求め方。 # およそ 3 val = 3 # 休憩 yield # 0.1 を足して val += 0.1 # 休憩 yield # 0.04 を足してできあがり val += 0.04 return val ) # @ が無いと piResult = PI calc # piResult は Number さね write("with no @, piResult is ", piResult, "\n\n") # @ 一つだと piResult = PI @calc # piResult は Future さね write("with one @, piResult is ", piResult, "\n") "waiting future...\n" print while(piResult isReady == Nil, "wait...\n" print yield ) # 値はこれで取れる write("OK. PI is ", piResult value, "!\n\n") # @ 二つだと piResult = PI @@calc # piResult は Nil さね write("with two @, piResult is ", piResult, "\n\n") writeln = method(x, write(x, "\n")) # @ 一つで結果が出たら writeln で報告して下さいな piResult = PI @calc piResult sendResultTo(Lobby, "writeln") # 終わった後に 3.14 と出るはず write("main end\n\n")
実はこのサンプルは現状では main end と表示した後に落ちます。どうも Io のバグらしいということで ML でご報告したところ程なく fix する方法 を提示して頂いたのでいずれ修正されると思います。(追記: IoVM-2003-12-11 にて既に修正されてます)
…全てがメッセージ、ってことはわかってたつもりなんですけど、このメールもらうまで、@ と @@ がメッセージということは失念というか何というか、頭の中にありませんでした。つまり何が言いたいかというと lua_resume のような特別な関数が無くても、 Io を組み込め で示したのと同じ方法で Concurrency が使えるんだなあ、と。