[#6214] RE^2: HTML class — 青山 和光 <PXN11625@...>
In-Reply-To: [ruby-list:6118] Re: HTML class
[#6219] Ruby連載 第4話 — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
原です。
まつもと ゆきひろです
原です。
ももちゃん@あるもにこすです.
まつもと ゆきひろです
In message <199802040557.OAA18458@picachu.netlab.co.jp>
まつもと ゆきひろです
In message <199802040739.QAA20750@picachu.netlab.co.jp>
まつもと ゆきひろです
In message <199802040803.RAA24375@picachu.netlab.co.jp>
[#6249] Re: i++ — 助田 雅紀 <masaki.suketa@...>
助田です。
ことけんです
まつもと ゆきひろです
しげひろです.
ももちゃん@あるもにこすです.
まつもと ゆきひろです
ももちゃん@あるもにこすです.
まつもと ゆきひろです
[#6256] pop & smtp-lib.rb — tateishi@... (Takaaki TATEISHI)
立石@理科大です。
[#6272] I'd like to subscribe this ML — INOUE Katsuyuki <inoue@...>
井上勝行 と申します。
[#6279] Re: i++ — 助田 雅紀 <masaki.suketa@...>
助田です。
[#6314] RE: ruby's design policy (Re: I'd like to subscr ibe this ML) — 助田 雅紀 <masaki.suketa@...>
オブジェクト指向周辺をぶらぶらしている助田です。
まつもと ゆきひろです
井上勝行です。
まつもと ゆきひろです
[#6315] install some versions — gotoken@... (GOTO Kentaro)
ごとけんです
[#6333] ruby 流に添削して下さい — nkon@...2.3web.ne.jp
さくです.
さくです.自己フォロー.
まつもと ゆきひろです
わたなべです.
まつもと ゆきひろです
わたなべです.
[#6342] Re: ruby's design policy (Re: I'd like to su bscr ibe this ML) — 助田 雅紀 <masaki.suketa@...>
助田です。
[#6372] ruby 1.1b7 released — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
前田です。
わたなべです.
ふなばです。
まつもと ゆきひろです
ふなばです。
[#6373] call for scripts — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
> もっと良いものがあるかもしれないと考え,実例集に載せられるよ
sort-schedule.rbで、ちょっと疑問に思っていることがあるのです
金城です.
まつもと ゆきひろです
金城です.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
原です。
From: Shin-ichiro HARA <sinara@blade.nagaokaut.ac.jp>
きくたに@ぷ〜たろ〜です。
さくです.
わたなべです.
まつもと ゆきひろです
前田です。
前田です。
まつもと ゆきひろです
前田です。
前田です。
前田です。
前田です。
わたなべです.
ふなばです。
In message <19980222011624S.tadf@kt.rim.or.jp>
前田です。
ふなばです。
ふなばです。
けいじゅ@日本ラショナルソフトウェアです.
Regard to "[ruby-list:7447] Re: call for scripts"
[#6422] simple_chat_server — 青山 和光 <PXN11625@...>
In-Reply-To: [ruby-list:6395] Re: call for scripts
[#6447] gsub — Tadayoshi Funaba <tadf@...>
ふなばです。
[#6514] ROT13/47 — OZAWA Sakuro <crouton@...>
小澤さくです.
[#6516] RE^2: simple_chat_server — 青山 和光 <PXN11625@...>
In-Reply-To: [ruby-list:6437] Re: simple_chat_server
まつもと ゆきひろです
class String; def - x; end; end; %-
[#6538] IE favorites to HTML — OZAWA Sakuro <ozawa@...>
小澤さくです。会社からもMLに入っちゃいます。
[#6565] Re: Counter class [Re: i++ ] — toyofuku@...
豊福@パパイヤです。
[#6582] File::Separator on cygwin — OZAWA Sakuro <ozawa@...>
小澤さくです。
わたなべです.
小澤さくです。
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
[#6591] ruby 1.1b8 released — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
前田です。
けいじゅ@日本ラショナルソフトウェアです.
前田です。
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
さくです.
前田です。
小澤さくです。
うさぎの名前ででています:-)
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
[#6601] 8-queen — TAKAHASHI Masayoshi <maki@...>
高橋です。今度ちゃんと1.1b7にします……と書こうとしたら、b8になって
[#6605] true/TRUE false/FALSE nil/NIL — OZAWA Sakuro <crouton@...>
小澤さくです.
前田です。
まつもと ゆきひろです
[#6610] tcltklib dosen't compile — TEI meiki <tei@...>
鄭です。
[#6621] here document — Tadayoshi Funaba <tadf@...>
ふなばです。
[#6635] hello — WATANABE Tetsuya <tetsu@...>
渡辺哲也と申します。
まつもと ゆきひろです
>>>>> "matz" == Yukihiro Matsumoto <matz@netlab.co.jp> writes:
[#6706] Re: Counter class — toyofuku@...
豊福@パパイヤです。
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
[#6735] Mutex/ConditionVariable/Queue — shugo@... (Shugo Maeda)
前田です。
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
前田です。
From: shugo@po.aianet.ne.jp (Shugo Maeda)
前田です。
From: shugo@po.aianet.ne.jp (Shugo Maeda)
前田です。
まつもと ゆきひろです
[#6786] Re: Mutex/ConditionVariable/Queue — senda@...
From: shugo@po.aianet.ne.jp (Shugo Maeda)
前田です。
前田です。
前田です。
けいじゅ@日本ラショナルソフトウェアです.
In message <199802261520.AAA18702.keiju@cupmail0.rational.com>
前田です。
In message <199802270237.CAA00362@soleil.localnet.or.jp>
前田です。
In message <199802270635.GAA00354@soleil.localnet.or.jp>
前田です。
[#6819] ruby 1.1b9 released — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#6829] monitor.rb — shugo@... (Shugo Maeda)
前田です。
[#6830] what is 'octet decimal' — OZAWA Sakuro <crouton@...>
さくです.
[#6852] Counting Semaphore — Kazuhisa YANAGAWA <katze@...>
Counting semaphore をちょっと作ってみました. 見ての通り, コードは
[ruby-list:6833] Re: coerce
けいじゅ@日本ラショナルソフトウェアです.
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 <<---