From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 1999-08-17T19:59:01+09:00 Subject: [ruby-dev:7704] Re: [ruby-ext:00382] New coerce scheme けいじゅ@日本ラショナルソフトウェアです. だんだんはまってきていると感じる今日このごろです(^^;;; In [ruby-dev :7697 ] the message: "[ruby-dev:7697] Re: [ruby-ext:00382] New coerce scheme ", on Aug/16 23:45(JST) Shin-ichiro HARA writes: >原です。 >> 豊福@パパイヤです。 >> (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' で結果を出したりする) > >この案はかなり納得のいくアイデアです。 あまり納得行ってほしくない気分が非常にあります. この方法で気になるのは, ほとんど同じアルゴリズムを持つ演算が2つづつ必要 になりますよね. >ただ、(ii) があれば (iii) はほとんど必要ないですよね。前に >必要になる例をあげていただいた覚えがありますが。 さらにこうなると... (ii)は基本的に実装しなくて(iii)を利用する考え方: >> 「左側からのop」をどう表現するのかとか、それがないとき >> どう (左側からの一般的演算用処理)(op, other) に変換するのか >> とかは全然考えてないです。 > >字句解析上可能かどうかわからないのですが、2項演算子の後ろ >に ! を付けて反対にしたらどうでしょう。で、Numeric の様な基底ク >ラスで +(other) の定義を other +! self にし、+!(other) の定義を >a, b = other.coerce(self, :+!); b + a; みたいにしておきます。 > >サブクラスは、知らない相手に対する + や +! は super して、さら >に coerce は再定義するという形で拡張していく訳です。 これだと op! は基本的に実装しなくても良さそうなので, なかなかよいかもし れません. # 気分的には, Object#extend の Module#extend_objectののりですね. でも, coerceの考え方は従来通踏襲していますのでそれがどうにかならないのか なってのがありますが... coerceをもう一度考えてさらに演算についてどうする か考えたほうがよいような... # ああ. 深みにはいる.... __ ..............................石塚 圭樹@日本ラショナルソフトウェア... ----------------------------------->> e-mail: keiju@rational.com <<---