今年の 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
面白いんですけど、まだしっかり考えられてないのでメリットデメリットがよくわかってないです。