From: YANAGAWA Kazuhisa Date: 1998-07-01T19:41:06+09:00 Subject: [ruby-dev:3177] Re: experimental release 1.1b9_28 in [ruby-dev:3144] Re: experimental release 1.1b9_28 Tadayoshi Funaba writes: > > シンプルではあるんですが,ちょっと違いますよね.proc のままでもでき > > てしまう. > > えーと、そこを教えてくれませんか? 僕はよくわかってないかもしれないで > す。 foo = Proc.new { some_time_consuming_task } : if needed? foo bar = foo.call end ってやって,後は bar をつかう,というのと変わらない,と.....「値を 使うときには一定のやり方をするだけで,式が高々一回だけ評価されること が保証される」という点ではあの delay は十分優れているのですが. # 今気づいた.間抜け. で,何が「ちょっと違う」かというと,scheme の delay っていうのは確か force で計算させた後は値そのものとして使えたような気がしたんです. (define foo (delay 10)) (force foo) (+ foo 1) -> 11 ではなかったかと. # 何か気のせいのような気がしてきてますが. > で、よくみてないんで、勘違いしているかもしれませんが、だいたいうまくゆ > くと思うのですが、これはメッセージを送らないと評価されないんですよね。 > ですから、やはりそれなりに気をつけないと、思ったとおりにならないってこ > とはありそうですよね。 上の scheme での例のようなこと(ただしもっと透過)を想定しているので, Promise は 1. メッセージが送られたときに高々一回だけ式が評価されること. 2. 不必要なときには評価されないこと.特に代入や引数として渡される 場合に評価されないこと. 3. さらに必要なら値のオブジェクトを取り出して,計算の効率化も図れ ること. を満たしたかったわけです.ただ転送すべきメソッドとそうでないメソッド がちゃんとしてないと問題がある,と. # future の方は abcl よりも multilisp だ,ということで,同じように透 # 過になるようになってます.まあ理解が怪しいという話まで一緒なんです # が (^^; > 僕が Delay を書いたのは、以前に ruby-list で質問したことですけど、一度 > だけ評価してくれるインスタンスメソッドを書くためのある実験のためでした。 > そのためにはこれでも十分で、今日実際にやってみて、それなりに甲斐はあっ > たと思います。 once? よく使うようなら「最初に呼び出されたとき一度だけ評価され,後の 参照ではこの最初の評価の結果を返す」という機能を組み込んじゃった方が 使い勝手はよさそうですね. # そういや Eiffel にはそんなのがあったな.よく使うんだろうか? =========================================================================== 柳川和久 @ 東大阪市 . 大阪府 kjana@os.xaxon.ne.jp July 1, 1998 「....少なくとも 夜の空の方が本物だということはわかったな.昼間の空は書き割だ」 「なによそれ」「へんだぜ」