はじめまして正木といいます。分からないことがあるので教えてください。
その前に BigNum の Bug らしきものを見付けたので報告しておきます。
p 19605335450%3308059755   #=> -1229930621
p -1229930621%3308059755   #=> 5227900106
(version 1.6.2)

以下質問です。
次のような class
class Sequence
  def initialize(list,*para)
    @list=list
    @para=para
    @proc=eval("proc{"+yield+"}")
  end
  def [](n)
    @list[n] || @list[n]=@proc.call(n,*@para)
  end
途中省略...
  def find
      @list.find{|x| yield x} ||
      (r=nil;each{|x| if yield(x) then r=x;break;end};r)
  end
end
を定義して
Factorial=Sequence.new([1]){"|n| n*self[n-1]"}
Prime=Sequence.new([2,3]){"|n| (m=self[n-1]+2;m+=2 while self.find{|k| break i
f k*k>m; m%k==0};m)"}
def (Power={}).[](x)
  super || Power[x]=Sequence.new([1],x){"|n,x| x*self[n-1]"}
end
def Exp(x);(Power[x]/Factorial).sum{|x| x>$error};end
の様に使っています。
上の例では block の中を文字列で与えていますが、本当は block を直接
Sequence.new([1],x){|n,x| x*self[n-1]}
の様に渡せるはずだと思って、色々試したのですがうまく行かないので
教えてください。単純に initialize の @proc を
   @proc=proc{instance_eval(&proc)}
に変えただけでは駄目なようです。
block 引数の受渡しがうまく行きません。
(instance_eval に block を与えた時の振舞がよく分からないので
どなたか解説してください。) 
    @proc=eval("proc",binding)
としてみても self は main のままです。

block を文字列で受け取る方法があれば一番簡単なんですが
そういうmethodはありますか?
以上よろしくお願いします。