Io - Concurrency

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 が使えるんだなあ、と。

プログラム言語 Io のはなし

情報を散逸させるのもなんなんで、まとめておきました。シンプルな言語なんで情報としては十分な気が。

しかし Io リファレンス翻訳 すばらしい。元のドキュメントは確かにリファレンスと言うにはアレなんですけど、ちゃんとある程度要点はおさえられていますし、簡潔な英語で読みやすかったのでこれはこれでいいかな、と。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h