ごとけんです

古い話ですが、1.3になったしそろそろ解禁かと思い持ち出します。

  [ruby-list:9109] Re: irb -m
  [ruby-list:9180] induced_from

に端を発する議論で、次のような結論が出ました。

  要求1  Numeric#prec(klass) が欲しい。引数として与えられた
	 精度に self を変換した結果を返すもの。
  要求2  計算精度を担うクラスを特徴づける Mixin Precision が
         欲しい。今のところ、 prec を実現するためのクラスメソッド
         induced_from(klass) が提案されている。

当時の議論の流れをまとめてみましたので御勘案ください。

  * Matrix#to_i は to_i のくせに Matrix を返すのは変

  * Matrix の to_i, to_f の意味は精度指定なので、それなら陽に
    名を持つ prec(klass) というのを作るべし

  * ただしprec(Float), prec(Integer) の省略形 prec_f, prec_i は
    いるだろう

  * 自作クラスに prec を実装する際に自分の知らない型への変換を
    委ねるため次のためのクラスメソッド induced_from は有意義

        def prec(klass)
          if klass in 自分が知ってる精度クラスたち
            適切な変換
          else
             klass.induced_from(self)
          end
        end

  * さらに精度を担うクラスのための Mixin として Precision が
    あると精度クラスの設計の指針になり有意義なので次のような
    ものは組み込みで用意されるべき

        module Precision
          def prec(klass)
            klass.induced_from(self)
          end

          def prec_i
            prec(Integer)
          end

          def prec_f
            prec(Float)
          end

          def Integer.induced_from(n); n.to_i; end
          def Fixnum.induced_from(n); n.to_i; end
          def Bignum.induced_from(n); n.to_i; end
          def Float.induced_from(n); n.to_f; end
        end

        class Numeric
          include Precision

          def prec(klass)
            case klass
            when Integer
              to_i
            when Float
              to_f
            else
              super
            end  
          end
        end

        class Complex
          include Precision

          def prec(klass)
            case klass
            when Integer, Float, Rational
              Complex(@real.prec(klass), @image.prec(klass))
            when Complex
              self
            else
              super
            end
          end
        end

-- gotoken