あおきです。

  In mail "[ruby-list:28333] Re: argument to instance_eval block(Re:"
    正木 功 <GEC01122 / nifty.ne.jp> wrote:

> 正木です。

> 次のような script (これは "Ruby プログラミング入門" p202 の fib2.rb
> を見て こんな便利な方法があるのかと思って一般化してみたものです。
> 演算子や sum,limit 等を定義しておけば、無限数列や無限級数を自然に扱
> うことができて非常に便利です。)

いやあ、やれるからといってやる必要はないですから。特にこの状況なら
self にアクセスできればいいだけなんで、instance_eval はオーバー
スペックでしょう。素直に self を yield してやればいいと思います。
-------------------------------------------------------------------
青木峰郎


class Sequence

  include Enumerable

  def initialize( list, *x, &block )
    @list = list
    @x = x
    @proc = block
  end

  def []( n )
    @list[n] ||= @proc.call( self, n, *@x )
  end

  def each
    i = 0
    loop do
      yield self[i]; i += 1
    end
  end

end


def (Power = {}).[]( x )
  super || Power[x] = Sequence.new([1],x) {|seq, n, x| x * seq[n-1] }
end

m = ARGV[0].to_i
p Power[2].find {|x| x > m }