[#6219] Ruby連載 第4話 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

32 messages 1998/02/04
[#6221] Re: Ruby連載 第4話 — Shin-ichiro HARA <sinara@...> 1998/02/04

原です。

[#6224] Re: Ruby連載 第4話 — Yasunari Momoi <conan@...> 1998/02/04

ももちゃん@あるもにこすです.

[#6225] Re: Ruby連載 第4話 — matz@... (Yukihiro Matsumoto) 1998/02/04

まつもと ゆきひろです

[#6249] Re: i++ — 助田 雅紀 <masaki.suketa@...>

助田です。

33 messages 1998/02/04
[#6252] Re: i++ — gotoken@... (GOTO Kentaro) 1998/02/05

ことけんです

[#6255] Re: i++ — matz@... (Yukihiro Matsumoto) 1998/02/05

まつもと ゆきひろです

[#6260] Re: i++ — Yuji Shigehiro <sigehiro@...> 1998/02/05

しげひろです.

[#6314] RE: ruby's design policy (Re: I'd like to subscr ibe this ML) — 助田 雅紀 <masaki.suketa@...>

オブジェクト指向周辺をぶらぶらしている助田です。

11 messages 1998/02/06

[#6333] ruby 流に添削して下さい — nkon@...2.3web.ne.jp

13 messages 1998/02/07
[#6335] Re: ruby 流に添削して下さい — OZAWA Sakuro <crouton@...> 1998/02/07

さくです.

[#6372] ruby 1.1b7 released — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

24 messages 1998/02/10
[#6402] parsedate (Re: ruby 1.1b7 released) — WATANABE Hirofumi <watanabe@...> 1998/02/13

わたなべです.

[#6405] Re: parsedate (Re: ruby 1.1b7 released) — Tadayoshi Funaba <tadf@...> 1998/02/13

ふなばです。

[#6407] Re: parsedate (Re: ruby 1.1b7 released) — matz@... (Yukihiro Matsumoto) 1998/02/13

まつもと ゆきひろです

[#6373] call for scripts — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

133 messages 1998/02/10
[#6414] Re: call for scripts — Terutuoshi Kaneshiro <k-teru@...06.odn.ne.jp> 1998/02/14

金城です.

[#6428] Re: call for scripts — matz@... (Yukihiro Matsumoto) 1998/02/16

まつもと ゆきひろです

[#6448] Re: call for scripts — Terutuoshi Kaneshiro <k-teru@...06.odn.ne.jp> 1998/02/16

金城です.

[#6452] Re: call for scripts — matz@... (Yukihiro Matsumoto) 1998/02/17

まつもと ゆきひろです

[#6481] Re: call for scripts — Kikutani Makoto <kikutani@...> 1998/02/17

きくたに@ぷ〜たろ〜です。

[#6483] Re: call for scripts — OZAWA Sakuro <crouton@...> 1998/02/17

さくです.

[#6495] Re: call for scripts — WATANABE Hirofumi <watanabe@...> 1998/02/18

わたなべです.

[#6416] Re: call for scripts — shugo@... (Shugo Maeda) 1998/02/14

前田です。

[#6417] rgrep (Re: call for scripts) — shugo@... (Shugo Maeda) 1998/02/15

前田です。

[#6423] Re: rgrep (Re: call for scripts) — matz@... (Yukihiro Matsumoto) 1998/02/16

まつもと ゆきひろです

[#6612] Re: call for scripts — Tadayoshi Funaba <tadf@...> 1998/02/21

ふなばです。

[#6582] File::Separator on cygwin — OZAWA Sakuro <ozawa@...>

小澤さくです。

19 messages 1998/02/20
[#6583] Re: File::Separator on cygwin — WATANABE Hirofumi <watanabe@...> 1998/02/20

わたなべです.

[#6586] Re: File::Separator on cygwin — OZAWA Sakuro <ozawa@...> 1998/02/20

小澤さくです。

[#6591] ruby 1.1b8 released — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

32 messages 1998/02/20
[#6620] rbc.rb and binding — shugo@... (Shugo Maeda) 1998/02/22

前田です。

[#6629] Re: rbc.rb and binding — keiju@... (石塚圭樹 ) 1998/02/23

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

[#6643] Re: rbc.rb and binding — shugo@... (Shugo Maeda) 1998/02/23

前田です。

[#6649] Re: rbc.rb and binding — keiju@... (石塚圭樹 ) 1998/02/23

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

[#6650] Re: rbc.rb and binding — matz@... (Yukihiro Matsumoto) 1998/02/23

まつもと ゆきひろです

[#6667] JRI 0.5 worked (was Re: rbc.rb and binding) — OZAWA Sakuro <crouton@...> 1998/02/23

さくです.

[#6687] Re: JRI 0.5 worked (was Re: rbc.rb and binding) — shugo@... (Shugo Maeda) 1998/02/24

前田です。

[#6712] JRI and JDBC — OZAWA Sakuro <ozawa@...> 1998/02/24

小澤さくです。

[#6635] hello — WATANABE Tetsuya <tetsu@...>

渡辺哲也と申します。

15 messages 1998/02/23

[#6706] Re: Counter class — toyofuku@...

豊福@パパイヤです。

12 messages 1998/02/24

[#6735] Mutex/ConditionVariable/Queue — shugo@... (Shugo Maeda)

前田です。

27 messages 1998/02/24
[#6746] Re: Mutex/ConditionVariable/Queue — keiju@... (石塚圭樹 ) 1998/02/25

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

[#6747] Re: Mutex/ConditionVariable/Queue — shugo@... (Shugo Maeda) 1998/02/25

前田です。

[#6752] Re: Mutex/ConditionVariable/Queue — senda@... 1998/02/25

From: shugo@po.aianet.ne.jp (Shugo Maeda)

[#6754] Re: Mutex/ConditionVariable/Queue — shugo@... (Shugo Maeda) 1998/02/25

前田です。

[#6756] Re: Mutex/ConditionVariable/Queue — senda@... 1998/02/25

From: shugo@po.aianet.ne.jp (Shugo Maeda)

[#6786] Re: Mutex/ConditionVariable/Queue — senda@...

From: shugo@po.aianet.ne.jp (Shugo Maeda)

33 messages 1998/02/26
[#6791] Re: Mutex/ConditionVariable/Queue — shugo@... (Shugo Maeda) 1998/02/26

前田です。

[#6794] Re: Mutex/ConditionVariable/Queue — shugo@... (Shugo Maeda) 1998/02/26

前田です。

[#6796] Re: Mutex/ConditionVariable/Queue — keiju@... (石塚圭樹 ) 1998/02/26

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

[ruby-list:6833] Re: coerce

From: keiju@... (Keiju ISHITSUKA)
Date: 1998-02-27 15:50:23 UTC
List: ruby-list #6833
けいじゅ@日本ラショナルソフトウェアです.

In [ruby-list :06821 ] the message: "[ruby-list:6821] Re: coerce ", on
Feb/27 18:46(JST) toyofuku@juice.or.jp writes:

>  豊福@パパイヤです。

>> 確かに, obj1 + obj2 と obj1 ** obj2 が違う型に変換したいことはあるかも
>> 知れません.
>> obj1のクラスをC1, obj2のくらすをC2とします.
>> C1が新規型の場合は問題ないですね. C1#+, C1#** の側で対処すれば良いので
>> すから, 問題はC1がIntegerなどの既存型の場合です. 
>
>  class Fixnum
>    alias plus_exept_for_matrix +
>    def +(other)
>      case other
>      when Matrix
>        エラー
>      else
>        rerun self.plus_exept_for_matrix(other)
>      end
>    end
>  end
>
>というのはできませんか。
>  新しい型を増やすたびに alias が増えていきますが。

いや, できます. ただ, この方法をすべてのクラスがとると

1. 複数のクラスでaliasするとわけがわからなくなる(まあ, coerceベースで
   も十分そうですが)

#  emacsとかでfsetを使っていると痛感するんですが, かなりいたいめに合う
#  確立が高いです.

#  上記のような簡単な方法だとload "matrix"を2回するだけで動作しなくな
#  ると思います. overloadしたaliasにさらにaliasするので無限ループに入
#  ります.

2. たぶん, 一番良く利用されるFixnum#+が遅くなる.

3. 一番の問題が, aliasすべきクラスが多いのでcoerceで対応した方が楽,
   Matrixをこの方法で追加しようとすると: メソッドの優先順位の関係で

      Fixnum#op
      Bugnum#op
      Float#op
      Rational#op
      Complex#op

  のすべてに対応しなくてはなりませんよね? これよりは, coerceで対応した
方が楽になると思います. 経験的には, したのクラスはまとめて扱えます. つ
まり, Rationalでは Fixnum/Bignum/Floatは1つのcaseで場合わけ可能ですし, 
ComplexではFixnum/Bignum/Float/Rationalを1つに扱えます.

# だからこそ, Smalltalkのシステムがそれなりに動いているのですが...

>> C1が新規型の場合は問題ないですね. C1#+, C1#** の側で対処すれば良いので
>
>  すべての新規クラスを考慮して秩序だって作っていける
>ならよいですが C1 と C2 をどんどん別の人が独立に作って
>いくような場合、C1 + C2 という新たな組合せを後から後
>から追加していかなければならないという問題はないですか。

そうですね. そういう意味ではこのクラスがどのクラスとの演算(coerce)をサ
ポートしているか明確にしなくてはなりませんね. さらに, 相互の互換性はお
互いに調整する必要がありますね.

# 今までは私しか作っていないので問題なかったんですが(^^;;; 

ちなみに現在は:

  (Fixnum->Bignum->Float) -> (Rational <-> Complex) -> (Matrix <-> Vector)

となっています. 

# 作った時期が主に関連しているんですが...

>> ただ, 問題は, 数システムに融合させるために定義するべきメソッドが多くて
>> 基本的にタイプスイッチを行なわなくてはならなくて既存クラスとの兼ね合い
>> をいろいろ考えなくてはならないってことですかね.
>
>  上の方法でも新しい型を作って実質そこにすべてまか
>せているようにバラエティあふれる演算に対して引数が
>other だけの coerce に協力させるのはきびしいような
>気がするのですが。

実際の話として, 数値的クラスってそんなに数はないと思いますし, 一般の人
が作るものでもないので, とりあえず対応できるってことでも満足するべきか
な? と思っています. 

まだ, 今なら本当に必要であるならば変更(のリクエスト)は可能であると思い
ますので検討の価値はあると思います.

# 良い案考えて下さい(^^;;;

>> 逆にSmalltalkだとこの
>> 辺り楽なんですが...
>
>  coerce という機構は ruby で初めて知ったのですが
>Smalltalk ではここらへんどういう態度をとっているの
>でしょうか。

もっと単純です.

昔かいた本 ``オブジェクト指向プログラミング'', ascii, pp.277-282 の中
にその記述があったのでそれをぬきだしますと::

# latexで書いてあるので読みにくいのはかんべんして下さい(__

# それに, 勝手に引用(ここまで長いと引用とはいえませんが)すると版権がら
# みで怒られちゃうのかな?

#-- ここから #--###########################################################

\subsection{1+1.0はどうするのか?  --一般性--}
Smalltalkでは, 加法演算子のような演算子はどのように定義するのでしょうか? 加
法演算子の問題点は, 以下で挙げるものです. 

\begin{enumerate}
\item 両辺のクラスが不定である. 
\item クラスによって加法のアルゴリズムがまったく異なってくる. 
\end{enumerate}

(1)は, 

\begin{itemize}
\item 1 + 1
\item 1 + 112132234874985723
\item 1 + $1 \over 2$
\item 1 + 1.0
\end{itemize}

などのように, 両辺にくるオブジェクトのクラスは様々であるということです. 

(2)は, 

\begin{itemize}
\item SmallIntegerの加法
\item Large(Positive/Negative)Integerの加法
\item Fractionの加法
\item Floatの加法
\end{itemize}

などによってアルゴリズムが異なっていてアルゴリズムの共用が不可能であること
です.

これらの問題に対してSmalltalkでは以下のように解決しています. まず, (2)で必
要になる加法はすべて用意します. 問題は両辺の型が一致しなかったときです. こ
の場合, 次のように処理が進みます.

\begin{enumerate}
\item 数のクラスには\term{一般性}{generality}の大小がある. 
\item その一般性を比較し, より一般度の高い方にクラスを合わせる(\term{強制}
      {coerce}すると呼ぶ). 
\item 再度演算を行う. 
\end{enumerate}

具体的にみていきましょう. 1 + 1.0について考えます. 

\begin{enumerate}
\item ``1 generality \q_<_ 1.0 generality''である. 
\item ``1''を``1.0''のクラスに合わせる. すなわち, Floatクラスのインスタンス
      ``1.0''にする.
\item ``1.0 + 1.0''を行う. 
\end{enumerate}

レシーバと引数のどちらを変換するかは, 双方のオブジェクトに対して
``generality''というメッセージを送り, その値の小さい方を大きな方に変換する
ことになっています. つまり, 自分を別クラスのオブジェクトに変換できる度合が
高いものほど, 一般性の値が低くなります.

一般性の値はデフォルトでは,

\begin{quote}
{\tt
 SmallInteger < Integer < Fraction < Float < Point
}
\end{quote}

の順番になっています. 

一般性を用いる方法は, クラス間で一般性の比較ができなくてはなりません. また,
どうしても強制が伴うため複数クラス間で型の強制ができないと適用できません. 
したがって, 一般的な問題に対してはあまりうまく適用できないといえます. 

#-- ここまで --#############################################################

ちなみにこの後, 他の技法である.

* ダブルディスパッチ
* マルチメソッド(CLOSとか)

の方法も簡単に説明してあります.

>>   ex. Matrix#-
>> 
>>   def -(m)
>>     case m
>>     when Numeric
>>       Matrix.fail ErrOperationNotDefined, "-"
>>     when Vector
>>       m = Matrix.column_vector(m)
>>     when Matrix
>>     else
>>       x, y = m.coerce(self)
>>       return x - y
>>     end
>>     
>>     Matrix.fail ErrDimensionMismatch unless row_size == m.row_size and column_size == m.column_size
>
>  case m に else があるのでこの Matrix.fail の行には
>来ないような気がするのですが違ってます?

わかりづらい書き方でしたかね...

  when Matrix 

のあとは何も書いてないのでcaseをぬけてfail以下に進みます. Cだとbreakす
る必要があるのでwhen Matrix/elseは同じ処理をすることになるんですがruby
では違いますよね.

# メインの処理とそれ以外の処理を分けて書いたつもりだったんですが...
__
................................石塚 圭樹@日本ラショナルソフトェア...
----------------------------------->> e-mail: keiju@rational.com <<---

In This Thread

Prev Next