まつもと ゆきひろです

In message "[ruby-list:12666] Re: alternative name of iterator"
    on 99/03/09, moochan <moochan / ss.hitachizosen.co.jp> writes:

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

「Rubyブロック」は新語じゃなくて「Rubyのブロック」の省略系で
す.ときどきイテレータブロックと呼ばれるアレですね.

イテレータ == ブロック じゃなくて,ブロックを受け取るメソッ
ドのことをイテレータと呼びます.つまり

  ary.each { ... }

において each がイテレータ, { ... } がブロックですね.

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

ああ,ありとあらゆるものがオブジェクトでないことについてです
ね.では,たとえばSmalltalkにおいてメソッドはオブジェクトで
はありませんが,これについてはどう思いますか? いくつかの言
語ではメソッドは立派なオブジェクトです.

あるいは変数がオブジェクトでないことについてはどうでしょうか?
いくつかの言語では変数はオブジェクトです(Cとか^^;;;).

あるい... 以下続く.

言語設計と言うのは結局はバランスの問題で,Smalltalkにおいて
オブジェクトとして扱われているものがすべからくオブジェクトで
あるべきかというとそうでもないわけです.

実際,Smalltalkにおいても ifTrue:ifFalse: とか whileTrue: と
かは,ブロックをブロックオブジェクトとして扱っているわけでは
なくて,メソッド呼び出しではない内部的な制御構造に変換してい
ます.統一的にオブジェクトとして扱っているように見えるのは幻
想に過ぎないわけです.

んでもって,私がRubyを設計したときに,「うん,これは表面的に
はオブジェクトでないほうが使いやすい」と判断したわけですね.
ま,それを好きな人もいるでしょうし,嫌いな人もいるでしょう.

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

ブロックはすべてオブジェクトにせよ,という提案だと思いますが,
Smalltalkでさえ実装上はオブジェクトとして扱うことを拒否した
前歴を考えるとあまり良い選択とは思えませんです.

|>それはifTrue:ifFalse:のせいではないですか? つまり,Rubyのイ
|>テレータの仕様のせいではなく,Rubyにはちゃんとした(普通の)制
|>御構造があるので,そういう目的にブロックを使う必要がないと.
|>で,そういう目的でない使い方であるコレクション系クラスには残っ
|>たと思います.
|
|Smalltelk では,true も false もオブジェクトですが,しかもメッセージを受
|信する立派なオブジェクトですね.
|# あ.Rubyのそれもオブジェクトですが,Smalltalkとは異なりますね.まるで
|# VBみたいに.

VBみたいなとは失礼な..

以下のものを見てどう思います?

  class TrueClass
    def ifTrue
      yield()
    end
  end

  class FalseClass
    def ifFalse
    end
  end

  (5 == 25).ifFalse {
    print "false\n"
  }

  (5 < 25).ifTrue {
    print "true\n"
  }

まあ,失礼うんぬんは冗談ですが,trueもfalseも立派なメッセー
ジを受け取るオブジェクトであることは認識して頂きたいです.む
しろ,Smalltalkの方がifTrue:ifFalse:を特別扱いしている点で
(見掛けはともかく)オブジェクト指向的ではないかも.

|何かもう少し簡単で具体的で結果を試せるようなサンプルを示して頂けると有難
|いですねえ.

「簡単で具体的で結果を試せる」とはまた難しいことをおっしゃる.
それが簡単にできるようなら苦労してませんって.^^;;;

                                まつもと ゆきひろ /:|)