けいじゅ@日本ラショナルソフトウェアです.

In [ruby-math :00510 ] the message: "[ruby-math:00510] Re: Forward:
Re: Ruby as opposed to Python? ", on Jul/31 15:02(JST) Yukihiro
Matsumoto writes:

>まつもと ゆきひろです

>そこなんですよねえ。私はCの影響を深く受けているので、そのよ
>うに感じてましたが、int/int => float派の考えることも分からな
>いではないです。で、調べてみてちょっとショックだったのは
>(ruby-listでも書いたけど)多くのSchemeの処理系は5/2は2.5を返
>すんですよ。4/2は2だけど。exactnessについてきちんと書いてあ
>るR5RSを元にしててもそうなってるってのはすこしびっくり。

schemeって数の拡張ってできないでしょ? そういう処理系では、2.5になっても
よいと思うけど, Rubyでは拡張できるわけだからこれはちょっと困る.

# CLOSはどうなっているのかしら?

>|Paulの"the substitutability principle"ってのは良くわからない。そ
>|れは何時でも成り立っていると思うけど。可逆性か結合性の間違いかな
>|あ。っていうかPaulの英語って難しい。(^^;
>
>私も良く分かんないです。彼の英語の問題なのか私の知識がないか
>らなのか判断できませんでしたけど。substitutableってなんなん
>でしょう?

Liskovの置換原理ってやつですね. 分析設計界では結構メジャーな概念です. 添
付資料参照.

で, これが置換原理に反するかというとそうではないと思います.

Numeric
  Float
  Integer

になっていて, Numeric#/は定義されていませんので. で, Paulさんは
Float==Realなんでしょうね. そうすると,

  Real
    Integer

って継承関係が考えられます. すると, 置換原理に反すると. 

でやはり, FloatがRealと見なしているかどうかは大きいんですよね. で,
int/int->int派は Floatは不完全な数 =/= Realではない. ですので,
int/int->intなんです. 

わたしは, rationalでもよいんですが... 

From UML Reference Manual(の和訳)[未刊]
##---
置換原理(substitutability principle)

 Xと宣言されたタイプを持つ変数またはパラメータの宣言が与えられた場合、
その宣言のセマンティクスと使い方に違反せずに、Xの子孫(descendant)であ
る要素のどんなインスタンス(instance)でも実際の値として用いることができ
るという原理。言い換えれば、子孫要素のインスタンスを祖先要素のインスタン
スの代わりに用いることができるということです(この原理はBarbara Liskovに
よる)。

 「汎化(generalization)」、「実装継承(implementation inheritance)」、
「継承(inheritance)」、「インターフェイス継承(interface inheritance)」、
「多相(polymorphic)」、「プライベート継承(private inheritance)」も参
照のこと。

解説

 この原理の目的は、多相(polymorphic)操作が確実に動作できるようにする
ことです。これは論理的に不可欠な原理ではなく、むしろカプセル化の度合いを
与える実際的なプログラミング規則です。汎化(generalization)関係はこうし
た置換をサポートしています。

 置換原理の結果として、子は自分の親のプロパティを削除または放棄すること
はできません。そうでなければ、親を用いるよう宣言されている状況で子を代わ
りに用いることができなくなります。


__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---