西@九大です。

From: matz / netlab.co.jp (Yukihiro Matsumoto)
> これは私とは違う結論ですね。私は「乱数の発生と違って、『要素
> のランダムな選択』は要素を含むコレクションオブジェクトと不可
> 分である。よって実装するならコレクションオブジェクトのメソッ
> ドであるべきである」というのが私の結論です。

その「ランダムな選択」と「ランダム性の発生源」(現時点では乱数)との関係
も不可分ですから、どちらが「より結び付きが強いか」という問題ですよね。
多分、どちらに意識を置くかの違いで、優劣は無いと思います。

  * array(例えば)に対して、「ランダムな選択」を要求。
    (実装上は、array 内部で「ランダム性の発生源」を呼ぶ)

  * ランダム性の発生源に対して、「この中から選んで」と要求。
    (実装上は、double dispatchで自分に戻ってくる)

# 後者は、例えば、機能や性能の違う複数の random generator の存在を意識
# したもので、現在の Ruby には適合しないかもしれない

> 身がそれをサポートしない限り、型によるoverloadはダブルディス
> パッチで実現できない限り OO 的に望ましい結果にはならないよう

同意します。私も実装上は double dispatch で行い、それ(random)を言語側
が組み込みで定義しておくものが Numeric/Range/Array、というのが本意です。
表現が足りませんでした、すいません。

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

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

> # ディベートですか? 受けてたちます。^^;;;

いや、勝ち負けにこだわっている訳じゃないです。単に負けると悔しいだけで
す。(こだわってる)。ていうか、既に、興味の対象は既にまつもとさんの返事
(反論)に移ってたりして。。。こ、これが恋?

>     のいずれの(あるいはもっと別の)意味であるかをそれだけでは
>     決められません。あまたの解釈の中からひとつに決定させるに
>     は名前に決定力不足だと感じます。

はい。これまでの話を全て忘れて「array.random」を見直してみると、第一感
は「array.randomize!」な気がしてしまいました。確かに決定力不足ですね。
やっと、まつもとさんの「第一反駁」が理解できました。これが、常に懸念さ
れている「名前の問題」の本質ですか?

> おっと、Array#random は引っ込めたんでしたね。

ふふふ。必要とあらば、再提出しましょう。(磨きがかかったコウモリ)。
という事で、double dispatch 的には、やはり出さねばなりますまい。。。
(てことは、どうも最初は単なる overload を意図してたぽい)

> で、Kernel#rand(Numeric/Range/Array) については上述の理由で
> 賛成しません。

「名前が不適切」というのは理解できました。代案は見つかりませんが、強い
て書くなら random_get になりそうな。でも、それじゃつまらない(未定義語)。
どちらにしろ、これは解決可能な問題なので置いておくとして。

結局、Kernel#rand に賛成できない理由は何ですか?(反論付き肯定側最終弁
論堂々巡りバージョン'99師走)

  (1) 関数(rand)内で型に拘束されるのが嫌だから(拡張性がない)。
      ⇒ 実装は double dispatch で。関数(rand)はその統一的な窓口として。
         (よいなら、後は「名前の問題」だけ)
  (2) そもそも UNIX的に、rand は乱数を連想...
      ⇒ 上位互換だからいーじゃん!(感情論)
         (ダメなら、御破算)

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

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