るびきちです。

初等数学関数(sin, cos, ...)についてなんだけど、
やっぱり「内部で」 number.sin って感じで呼出せると便利だなと思った。
Math::sin number はあくまで number.sin の「インターフェース」で
あったらなぁって考えてみた。

(include して使用することもあるから、 sin(x) のように引数があったら
x.sin を呼出して、なかったら self.sin を呼出すようにする)

number が属するクラスの instance method として定義することで、
そのクラスにおける初等関数がきれいに定義できるんじゃないかな??
実際数だけでなく自動微分型や区間型にも sin などが定義されている。

現状のままだといちいち
def Math::sin(x)
  case x
    when Float, Fixnum, Bignum
      数学関数の sin
    when Autodiff
      自動微分型の sin
    when Interval
      区間型の sin
    else
      例外発生
    end
  end
end

って感じになって、新たに型を作ったときの修正が困難(>_<)
で、この方法を使うと、

module Math
  alias sin_ sin     #元々の定義を別名で保存
  module_function :sin_
  def sin(x=nil)
    if x then
      x.sin
    else
      self.sin
    end
  end
  module_function :sin
end

for klass in [Fixnum,Bignum,Float] 
eval <<END
  class #{klass}
  
  def atan2(x=nil); if x then x.atan2 else Math._atan2(self) end; end
  def cos(x=nil); if x then x.cos else Math._cos(self) end; end
  def sin(x=nil); if x then x.sin else Math._sin(self) end; end
  def tan(x=nil); if x then x.tan else Math._tan(self) end; end
  def exp(x=nil); if x then x.exp else Math._exp(self) end; end
  def log(x=nil); if x then x.log else Math._log(self) end; end
  def log10(x=nil); if x then x.log10 else Math._log10(self) end; end
  def sqrt(x=nil); if x then x.sqrt else Math._sqrt(self) end; end
  

end
END
end


class Autodiff
  def sin
    自動微分型の sin の定義
  end
end

class Interval
  def sin
    区間型の sin の定義
  end
end
...

となって、新たな型を作ったときに柔軟性をもって対応できると思ったのでした。
僕はこの方法を使って動作良好です(^O^)
欠点があったら指摘してください。

s=''; for x in %w!1633820737, 1377859938, 544825973, 1801675112, 539783781!; s += [x.to_i].pack("l") end; print s
るびきち☆