まつもと ゆきひろです

In message "[ruby-dev:8537] Re: [REQ] {enumerable, integer, range}.rand"
    on 99/12/06, Kazunori NISHI <kazunori / swlab.csce.kyushu-u.ac.jp> writes:

|その「ランダムな選択」と「ランダム性の発生源」(現時点では乱数)との関係
|も不可分ですから、どちらが「より結び付きが強いか」という問題ですよね。
|多分、どちらに意識を置くかの違いで、優劣は無いと思います。
|
|  * array(例えば)に対して、「ランダムな選択」を要求。
|    (実装上は、array 内部で「ランダム性の発生源」を呼ぶ)
|
|  * ランダム性の発生源に対して、「この中から選んで」と要求。
|    (実装上は、double dispatchで自分に戻ってくる)
|
|# 後者は、例えば、機能や性能の違う複数の random generator の存在を意識
|# したもので、現在の Ruby には適合しないかもしれない

そうですね。つまり現状では「要素」と「発生源」のくくりのうち
意味があるのは「要素」のみということで、関数的randにはあまり
賛成しません。これが仮に rand, random, drand48 などの複数の
乱数源があり、それぞれを適宜選択する必要があるという局面であ
れば違う結論が出るとは思います。

|で、質問なんですが、overload の具体的実現手段の1つとして double
|dispatch があると理解していたのですが、これは正しいですか?

正しいと思います。

|あと、ruby の組み込み関数(C言語?)で、double dispatch を実現する、とい
|うのは難しかったりしますか?(ruby 等なら楽に書けるのはわかるのですが)

特にそういうことは無いです。もっとも、内部的にメソッド呼び出
しがあると高速化に限界があると言うのはありますね。

|>     のいずれの(あるいはもっと別の)意味であるかをそれだけでは
|>     決められません。あまたの解釈の中からひとつに決定させるに
|>     は名前に決定力不足だと感じます。
|
|はい。これまでの話を全て忘れて「array.random」を見直してみると、第一感
|は「array.randomize!」な気がしてしまいました。確かに決定力不足ですね。
|やっと、まつもとさんの「第一反駁」が理解できました。これが、常に懸念さ
|れている「名前の問題」の本質ですか?

その通りです。

|結局、Kernel#rand に賛成できない理由は何ですか?(反論付き肯定側最終弁
|論堂々巡りバージョン'99師走)
|
|  (1) 関数(rand)内で型に拘束されるのが嫌だから(拡張性がない)。

その通りです。

|      ⇒ 実装は double dispatch で。関数(rand)はその統一的な窓口として。
|         (よいなら、後は「名前の問題」だけ)

ダブルディスパッチによる実現については、前述のように「乱数発
生源」というくくりでまとめる必要があるのなら話は別ですが、
「別にそんなことしなくていーじゃん」という気がします。

|  (2) そもそも UNIX的に、rand は乱数を連想...
|      ⇒ 上位互換だからいーじゃん!(感情論)
|         (ダメなら、御破算)

これもありますが、私の理由は

   (3) メソッド型(obj.random_get)よりも関数型の
       API(rand(obj))を選ぶ理由が無い

でしょうか。

|これでどうでしょう。これでダメならもう僕は鳥になる。。。(なれよ)

見てみたいものです。^^;;;
                                まつもと ゆきひろ /:|)