まつもと ゆきひろです

In message "[ruby-dev:1572] Re: [BUG] String.dup"
    on 98/03/04, 石塚圭樹 <keiju / rational.com> writes:

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

|>Stringに関してはこれで良いんですけど,ThreadやProcなど数多く
|>の組み込みクラスをPrimitiveのサブクラスにするとか,拡張モジュー
|>ル内で定義されるクラスはどうするのか,とか考えるともうひとひ
|>ねり必要そうです.
|
|今ってそうなっていなかったんですか? DATAがそのクラスだと信じていたので
|すが? 

なってません.

T_DATAはオブジェクトの構造であってクラスではないです.Dataは
クラスですけど.T_DATAという構造をとるインスタンスをもつクラ
スは沢山ありますが,Dataのサブクラスになっているものはありま
せん.

|それはともかく, 代案としては.
|
|1. このままほっておく. Smalltalkでも同じような問題はありました. でも, 落ちや
|   しなかったですが...

これはちょっと保留して.

|2. PrimitiveなクラスはObjectのサブクラスではなくして, Kernelを直接イン
|   クルードする.

これはできません.というのもインスタンスがT_OBJECT以外の構造
をもつクラスはクラス階層の中に組み込まれているからです.たと
えば,NumericはComplexなどのスーパークラスですからObjectのサ
ブクラスである必要がありますが,FloatやBignum,Fixnumのスーパー
クラスでもあります.これらをNumericのサブクラスから外すのは
望ましくないと思います.

|4. 最初の案とにていますが, Primitiveはクラスでなくてモジュールとし特異
|   クラスでextendする.
|
|5. primitiveかどうかわかるフラグを各クラスにつける.

4,5はクラス定義のAPIが変わってしまうので望ましくないと思って
ます.今は「クラスを定義する」だけで済む単純なモデルなのです
が,これらは「普通のクラスの定義」と「インスタンスがT_DATAな
ど通常のオブジェクトでないクラスの定義」が違ってしまいます.

|3. Primitiveなクラスのnewは再定義できなくする. 

これは4,5で示すような方法で,「どのクラスがPrimitiveなクラス
か」をインタプリタに教えてやらなくちゃいけませんよね.それは
望ましくないと思ってます.

困ったなあ.
                                まつもと ゆきひろ /:|)