西@九大です。

今迄の話の流れと結論、そしてこのメールの位置付けです。

  * Kernel#rand(min..max)/(min, max)?   ⇒ よさそう
  * Array#random_get                    ⇒ よさそう(名前次第?)
  * Kernel#rand(obj)                    ⇒ ダメ ⇒ 何でさっ!

まず、「名前問題」は無視しています。あと、立場的には、RandomGenerator 
が複数存在しなくても、「乱数源」というオブジェクトに対するメッセージ、
という意味で(統一的な窓口の)存在価値はある、です。で、思想的な話です。

From: matz / netlab.co.jp (Yukihiro Matsumoto)
>    (3) メソッド型(obj.random_get)よりも関数型の
>        API(rand(obj))を選ぶ理由が無い

意見の食い違いはどうもここらへんの思想の違いにある予感。。。私は、

  * obj.random_get を持つ複数のクラスがあるなら、それを統一的に受ける
    窓口があってもよい。(double dispatch なので、obj.random_get が前提。
    それを捨てて rand(obj) だけ、という意味ではない)
  
と考えています。その為の double dispatch であると。で、何でこれが反対
されるのだろう?と思っていたのですが、まつもとさんの異論は直接これに向
けられているのでなく、

  * その窓口がなぜ関数(型)でなければならないのか?
    (RandomGenerator#rand/random(obj) とかなら許せる)

という事なのですか?

最初から気になってたんですが、なぜ「メソッド型」や「関数型」と区別する
んでしょうか?私は全く区別なく、ruby は全て「メソッド型」だと思ってい
ます。ruby スクリプト(のメイン部分?)は暗黙的に「include Kernel」され
た状態であると考えています。

ていうか、「ruby スクリプト」というものは、お手軽に書けるように、とい
う配慮から、

    class ARubyApplication
      include Kernel
      def initialize
        #   この部分
      end
    end

を書く事であり(クラス定義等はここでは無視)、ruby スクリプトの実行とは、
ARubyApplication.new を行う事なのです。(まつもとさんはまだ ruby をよく
御存知ないかもしれませんが)

すなわち、initialize 内にあるものは print でも rand でも、意味的には 
Kernel#print/rand です。ですから、syntax 上は完全とは言えないが、
semantics 上は「ruby は純粋な OO である」のです。

なので、「関数型のAPI(rand(obj))」呼ばわりで Kernel#rand(obj) が認めら
れないのには、イマイチ納得できません。rand(obj) を関数型というのならば
(syntax が大事と言うのならば)、ruby のメソッドは全て関数型です。同クラ
スのメソッド呼び出しでさえ self.method と書くような酔狂な人を除けば。

という事で、Kernel や RandomGenerator の違いも本質的でなく、「関数型」
「メソッド型」という違いもないので、Kernel#rand(obj) という統一的な窓
口がある事は不自然ではない、と思っています。


> |これでどうでしょう。これでダメならもう僕は鳥になる。。。(なれよ)
>
> 見てみたいものです。^^;;;

いや、ここだけの話。ruby の「b」は「bird」らしいですよ。(何か考えよう
としたが、もう一杯一杯らしい)

------------------------------------------------------------------
九州大学大学院システム情報科学研究科 情報工学専攻 博士後期課程三年
      西 和則   ( e-mail: kazunori / swlab.csce.kyushu-u.ac.jp )
------------------------------------------------------------------