原です。

In message "[ruby-dev:7706] Re: [ruby-ext:00382] New coerce scheme"
    on 99/08/17, Toyofuku <toyofuku / juice.or.jp> writes:
|
|  豊福@パパイヤです。

|けいじゅさん
|> この方法で気になるのは, ほとんど同じアルゴリズムを持つ演算が2つづつ必要
|> になりますよね.
|
|  でも例えば matrix.rb では Matrix に対する左側からの演算は
|Scaler の方に書かれているわけで見た目クラスがわかれている
|だけで実質2つずつ書かれているのと同じですよね。

同じですね。しかしこれは「行列*スカラー」と「スカラー*行列」
がたまたま同じだった(似ていた)だけだで、他のものどうしだった
ら違う場合もあり得るわけです。

けいじゅさんの問題にしているのは、すでに

  Ba Bb
  Aa Ab

という計算表がある時に C (= c) というクラスを加えて

  Ca Cb Cc
  Ba Bb Bc
  Aa Ab Ac

という計算表の Cc の部分を2回記述するのがいやといいう事で
しょう。Ca と Ac、Cb と Bc がたまたま一致しても無駄ではな
い。(実際違う場合もありうるから。)

私の案は「C の op に Ca Cb Cc を、op! に Bc Ac を定義させよ」
という感じかな。


|  方針としては、
|・基本的に(iii)を使う。
|・(iii)に書くと不自然になるものは(ii)で書く。
|です。

そうなんですか? 私は基本的には (ii) を使うのではないかと。

coerce の問題点は、Cb と Bc の様に形式として対称であるは
ずの処理が全然対称に見えなかったりすることと、利用法が定
まっていず、各クラスの間で紳士協定があるだけだということ
です。何でもありえるので、とんでもない coerce を書いて正
しく計算する人が出てくるかもしれない。

だから、coerce を書かなくてすむなら、coerce なしで済ませ
るというのが私の案です。多くの場合に当てはまるのではない
かと。

Scalar は、行列の事を知っているスカラーという意味ですよ
ね。下位の事を上位は知らなくていいという協定を破っていま
すね。紳士的な協定破りで面白いけど。(^^