Transparent Future

今年の 7月あたりに Io の Concurrency がちょっと変わってます。前書いたのはこれ。

http://d.hatena.ne.jp/shinichiro_h/20031211#p1

@ 一つの場合の帰り値の Future の仕組みが変わってまして、関数が yield せずに値を帰した段階で帰り値のオブジェクトに変化するようになりました。まだ実行中かどうかは、 Future#isReady ではなく Future#?("isWaitingFuture") で確認するようになりました。それ以外の方法で Future を参照しようとすると、即座に値を得ようとします。

まとめるとこんな感じ。

PI := Object clone
PI calc := method(
  # 正しいπの求め方。
  # およそ 3
  val := 3
  write("inside PI#calc\n")
  # 休憩
  yield
  # 0.1 を足して
  val = val + 0.1
  write("inside PI#calc\n")
  # 休憩
  yield
  # 0.04 を足してできあがり
  val = val + 0.04
  write("inside PI#calc\n")
  return val
)

piResult := PI @calc

"waiting future...\n" print
while(piResult ?isWaitingFuture,
  "wait...\n" print
  yield
)

# 値はこれで取れる
write("PI is ", piResult, "\n\n")

piResult = PI @calc

# Future を評価しようとすると即座に実行される
# PI is の後に inside PI#calc が割込むことに注意
write("PI is ", piResult, "\n")

write("end\n")

実行結果。 (IoVM-2004-09-21)

waiting future...
wait...
inside PI#calc
wait...
inside PI#calc
wait...
inside PI#calc
PI is 3.14

PI is inside PI#calc
inside PI#calc
inside PI#calc
3.14
end

面白いんですけど、まだしっかり考えられてないのでメリットデメリットがよくわかってないです。

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