豊福@パパイヤです。

  整理もかねて coerce の何がひっかかっているのか考えて
みました。

  coerce は

「クラスAのオブジェクトaとクラスBのオブジェクトbの演算
    a op b
をA側で計算できないとき
クラスA'のオブジェクトa'とクラスB'のオブジェクトb'が存在して
    a' op b'
の値として計算できる。ここで A',B' は既知のクラスか B または
Bとともに提供されるクラスで、
(1) A',B' は A と B にのみ依存し op には依存しない」

ということを基にして作られています。

  a op b は B側から見ると
    b.(左側からのop)(a)
のように見えます。
    b.(左側からの+)(a)
    b.(左側からの*)(a)
などいろいろありますが、大筋の処理は「op には依存しない」
と考えて、すべての左側からの演算の窓口を一つにしたものが
    b.coerce(a)
に対応していると思います。ただし
(2) 最後の計算 a' op b' は必ずクラスA'側でやる
ことになってますから(仮にB側で最後まで計算した方が話が
早そうだとしても)b.coerce(a) はその直前までをお膳立て
することになります。

  原さんの
> |class 数値関連クラス
> で、+(other) と coerce(other) では、とても似たことをしてますよね。

というのも +(other) と (左側からの+)(other) の類似から
来ているのだと思います。

  B が Complex のときまでは (1)(2) とも自然に実現されて
ますが、Matrix では (1)(2) を満たすために A' として
class Scaler を強引に提供しているように感じます。


  で、どうなって欲しいかですが、思いつきの案を書きます。

(i) A は
    a op b
  が計算できないときは
    b.(左側からのop)(a)
  として B に完全に任す。

(ii) B に
    def (左側からのop)(other)
  が定義されていればそのメソッドで処理される。

(iii) それがないときは
    def 左側からの一般的演算用処理(op, other)
  のメソッドで処理される。
  (このメソッドが従来の coerce に対応し self と other
   から a' と b'を計算して a' op b' で結果を出したりする)


  これは以前石塚さんの説明にあった左側からの演算用メソッド
の話と、引数にopを含む新coerce案を合わせたようなものになっ
てます。
  「左側からのop」をどう表現するのかとか、それがないとき
どう (左側からの一般的演算用処理)(op, other) に変換するのか
とかは全然考えてないです。
---
                        豊福@パパイヤ
                        unbound / papaya.juice.or.jp
                        toyofuku / juice.or.jp