moochan です.

On Tue, 9 Mar 1999 12:43:31 +0900
matz / netlab.co.jp (Yukihiro Matsumoto) wrote:

>ええ,その通りです.同じところもありますが,違うところもあり
>ます(でも「必要なら何度も繰り返し評価される」って点について
>は,Smalltalkブロック/Rubyブロック/手続きオブジェクトすべて
>に共通だと思います).

おや,新語登場ですか.Rubyブロック == イテレータ => true ですね.
「必要なら何度も繰り返し評価される」はそれはそうなんですが,私の
言わんとすることとは少し意味が違うんです.うまく表現できないです
が敢えて言うなら,定義した所だけで評価されるか,定義していないと
ころでも(変数などで)繰り返し評価されるかという違いでしょうか.
# 今の話はSmalltalkブロック/イテレータ の話で手続きオブジェクトは
# 別ですよ.

>いや,表現については気にしていません.ただ,私にはそのような
>過激な表現を招くなにかが良く分からなかったので,お尋ねしてい
>るのです.

過剰表現は,イテレータはオブジェクト指向に反することの表明です.

# でも大変便利だから自分の中では認めたい気もある(^^)


>|イテレータは本来レシーバに任せるべき手続きをセンダー側で定義し実行し
>|てしまう機能ですよね.そのとき対象となるオブジェクトはレシーバから取
>|ってくるイメージがあります.そういう意味で先の過激な印象になってしま
>|ったんですね.
>
>そうなんですか? 私のとは違ったイメージですね.

そうですか.たぶんRuby内部構造を知る者と知らざる者との違いでしょう.


>私はSmalltalkブロック(オブジェクト)とRubyブロック(非オブジェ
>クト)の本質的違いは
>
>  * それ自体がオブジェクトかどうか
>
>しかない(で,オブジェクト化すると手続きオブジェクトになる)と
>思ってます.

うーむ.そうなんですか.
だったら.Rubyオブジェクトは手続きオブジェクトに吸収するのは如何でしょう?
その方が,OOPLとしての設計アーキテクチャがスッキリすると思いますが.


>それはifTrue:ifFalse:のせいではないですか? つまり,Rubyのイ
>テレータの仕様のせいではなく,Rubyにはちゃんとした(普通の)制
>御構造があるので,そういう目的にブロックを使う必要がないと.
>で,そういう目的でない使い方であるコレクション系クラスには残っ
>たと思います.

Smalltelk では,true も false もオブジェクトですが,しかもメッセージを受
信する立派なオブジェクトですね.
# あ.Rubyのそれもオブジェクトですが,Smalltalkとは異なりますね.まるで
# VBみたいに.


>|>これはSmalltalkもRubyも両方そうなのでは? 両方とも現在のコン
>|
>|定義と言う意味では同じでしょうね.ただ評価する場所は異なりますが.
>
>Rubyもメソッドの内部で評価してるんですよ.

どこかのメソッド内部で評価が行われるのは必然でしょう.
私は内部構造に疎いので何ですが,内部ではSmalltalkと同じことをやっているの
かも知れません.が,見かけ上は全く異なるものに見えます.
Smalltalkはレシーバ内で評価され,Rubyではセンダー内で評価されるものに,と.


>「コンテキストを変更してブロックを評価するメソッド」の具体的なイメージが
>|湧かないのですが,アセンブラやCでよくやるコードでコードを書き換えるってや
>|つですか?
>
>たとえば,instance_evalなんかそうですね.
>
>   @foo                         # selfのインスタンス変数@foo
>   bar.instance_eval{@foo}      # barのインスタンス変数@foo
>
>ここでブロック内のコンテキストの一部(self)が書き変わってるわ
>けです.かなり反則ですね.

かなり反則とのニュアンスは伝わってきますが,いまいちinstance_evalな機能が
よく分かりません.
何かもう少し簡単で具体的で結果を試せるようなサンプルを示して頂けると有難
いですねえ.
# 大変興味をそそられる機能ではあります(^^)

---
(^。^)(^・^)(^-^)(^ム^)	〜 moochan / ss.hitachizosen.co.jp