豊福@パパイヤです。

けいじゅさん
>>class Counter
>>  def initialize(i = 0)
>>    @i = i
>>  end
>>  def incr; @i += 1 end
>>  def decr; @i -= 1 end
>>  def to_s; @i.to_s end
>>  def to_i; @i end
>>end
> 
> こんなの作ってみました. 
>   Counter#inc
>   Counter#dec
> 以外に, 一応四則演算などができるようになっています.

  ここまでくるともう変数クラス作った方がよく
ないですか。

class Var
  def initialize(obj = nil)
    @obj = obj
  end
  def method_missing(*args)
    @obj = @obj.send(*args);
  end
  def coerce(other)
    return other.coerce(@obj).reverse
  end
  def to_s
    "#" + @obj.to_s
  end
  def inspect
    "#<Var: " + @obj.inspect + ">"
  end
end

class Counter < Var
  def inc(skip = 1)
    ...
  end
  ...
end

	x = Var(2)
	y = Var(3)
	z = x * y

  coerce がよくわかってないのですが、これで
	z = x ** y    # z = 2 ** 3
とすると 9.0 になってしまいます。
なぜ 2 ** 3 ではなくて 3.0 ** 2.0 になって
しまうのでしょうか。 other.coerce(@obj).reverse
の reverse はない方がいい?  reverse なく
してもまだ 2.0 * 3.0 になってるし。

  それから
>   def coerce(other)
>     case other
>     when Counter

をまねして

  def coerce(other)
    case other
    when Var
      ...

とかもやってみたのですが、when Var のところに
来ません。Var(1) === Var も真にならないよう
ですがどこらへんがあやしいでしょうか。
---
			豊福@パパイヤ
			unbound / papaya.juice.or.jp
			toyofuku / juice.or.jp