From: matz@... (Yukihiro Matsumoto) Date: 1999-03-09T12:43:31+09:00 Subject: [ruby-list:12662] Re: alternative name of iterator まつもと ゆきひろです In message "[ruby-list:12661] Re: alternative name of iterator" on 99/03/09, moochan writes: |ええ.確かに手続きオブジェクトとSmallalkのブロックはよく似ています. |でも今話題にしているのは,手続きオブジェクトではなくイテレータです. |イテレータとSmalltalkのブロックは同じとは思えません. | |# イテレータ != 手続きオブジェクト ですよね. ええ,その通りです.同じところもありますが,違うところもあり ます(でも「必要なら何度も繰り返し評価される」って点について は,Smalltalkブロック/Rubyブロック/手続きオブジェクトすべて に共通だと思います). また,Smalltalkのブロックに対応するのはRubyのブロックではな く,手続きオブジェクトであるという点についてもその通りです. |表現が過激でしたね.すみません.(^^;;; いや,表現については気にしていません.ただ,私にはそのような 過激な表現を招くなにかが良く分からなかったので,お尋ねしてい るのです. |>それってRubyのブロックがそういうイメージがあるってことですか? | |イテレータは本来レシーバに任せるべき手続きをセンダー側で定義し実行し |てしまう機能ですよね.そのとき対象となるオブジェクトはレシーバから取 |ってくるイメージがあります.そういう意味で先の過激な印象になってしま |ったんですね. そうなんですか? 私のとは違ったイメージですね. 私はSmalltalkブロック(オブジェクト)とRubyブロック(非オブジェ クト)の本質的違いは * それ自体がオブジェクトかどうか しかない(で,オブジェクト化すると手続きオブジェクトになる)と 思ってます. |それから Smalltalk のブロックは,レシーバからの独立性が高いですがイ |テレータの場合低いように思います. |用途の違いも顕著です.イテレータはコレクション系クラス,Smalltalkの |ブロックは Boolean オブジェクトへのセレクタメッセージとしてよく用い |られます. それはifTrue:ifFalse:のせいではないですか? つまり,Rubyのイ テレータの仕様のせいではなく,Rubyにはちゃんとした(普通の)制 御構造があるので,そういう目的にブロックを使う必要がないと. で,そういう目的でない使い方であるコレクション系クラスには残っ たと思います. |>これはSmalltalkもRubyも両方そうなのでは? 両方とも現在のコン | |定義と言う意味では同じでしょうね.ただ評価する場所は異なりますが. Rubyもメソッドの内部で評価してるんですよ. |「コンテキストを変更してブロックを評価するメソッド」の具体的なイメージが |湧かないのですが,アセンブラやCでよくやるコードでコードを書き換えるってや |つですか? たとえば,instance_evalなんかそうですね. @foo # selfのインスタンス変数@foo bar.instance_eval{@foo} # barのインスタンス変数@foo ここでブロック内のコンテキストの一部(self)が書き変わってるわ けです.かなり反則ですね. まつもと ゆきひろ /:|)