From: Akinori MUSHA Date: 2002-03-24T17:56:47+09:00 Subject: [ruby-dev:16565] Re: BigFloat At Sun, 24 Mar 2002 15:41:18 +0900, akr wrote: > 私が mutable と思ったのは assign!, add!, sub!, mult!, div! の存在です。  BigFloat#assign というのもありますね。こういう操作を必要と思った ことがなく、他の Numeric と同様に扱っていたので見落としていました。 私も、これらは Ruby 側には公開しない方がよいと思います。  BigFloat に入れ物としてのインターフェースを持たせている必要性に ついて、作者の小林さんのお考えを聞きたいところです。 > >  あと、 Marshal に対応していないみたい。今夜にでもやってみます。 > > うぅむ。そんなのもありましたか。 > あと、Complex との演算もかな。  Complex 対応については Complex 側で対応するのがいいでしょうね。  また、先の Rational との演算も、 BigFloat でなく Rational 側で 相手の BigFloat の precision を見ながら自身を変換して演算する方が いいんじゃないかと思い直しました。 > なんとなく、やはり「仕様的にも実装的にも枯れている」と主張するのは難し > いのではのではなかろうか、という印象が強まっています... > > >  id/equal? については、(みなし) immutable の仕掛けを作るコスト > > との相談ですが、インスタンスのプールを管理するとか、仮想 id の > > ようなインターフェースを設けるとか、あまりうれしくない手間が > > 掛かりそうです。 > > そこは無理をしなくていい(今のままでも問題ない)と思いますが。  これを機に Ruby 自身の Numeric/immutable 回りのポリシーを確認 しておかないといけませんね。  「Numeric が immutable であるべき」というのには、不可改竄性の ほかに数値の固有性という問題があるので、 Numeric を継承する場合 hash() のオーバーライドを必須としてもよいかも知れません。 Index: numeric.c =================================================================== RCS file: /src/ruby/numeric.c,v retrieving revision 1.41 diff -u -r1.41 numeric.c --- numeric.c 2002/03/22 07:26:35 1.41 +++ numeric.c 2002/03/24 08:47:32 @@ -97,6 +97,23 @@ } static VALUE +num_hash(x) + VALUE x; +{ + switch (TYPE(x)) { + case T_FIXNUM: + case T_BIGNUM: + case T_FLOAT: + return rb_obj_id(x); + default: + /* Numerics are immutable values, which should define hash() properly */ + rb_raise(rb_eNotImpError, "%s should override hash() properly", + rb_class2name(CLASS_OF(x))); + return Qnil; /* not reached */ + } +} + +static VALUE num_uplus(num) VALUE num; { @@ -1624,6 +1641,7 @@ rb_include_module(rb_cNumeric, rb_mComparable); rb_define_method(rb_cNumeric, "coerce", num_coerce, 1); rb_define_method(rb_cNumeric, "clone", num_clone, 0); + rb_define_method(rb_cNumeric, "hash", num_hash, 0); rb_define_method(rb_cNumeric, "+@", num_uplus, 0); rb_define_method(rb_cNumeric, "-@", num_uminus, 0); -- / /__ __ Akinori.org / MUSHA.org / ) ) ) ) / FreeBSD.org / Ruby-lang.org Akinori MUSHA aka / (_ / ( (__( @ iDaemons.org / and.or.jp "Somewhere out of a memory.. of lighted streets on quiet nights.."