まつもと ゆきひろです

In message "[ruby-list:12661] Re: alternative name of iterator"
    on 99/03/09, moochan <moochan / ss.hitachizosen.co.jp> 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)が書き変わってるわ
けです.かなり反則ですね.
                                まつもと ゆきひろ /:|)