原です。

>正木です。

>Proc**Proc = Proc
>これは Proc が2個以上の要素を持つ限り有り得ないことですが、
>この辺の事情はどうなっていますか?

この話は ruby-math に行きましょうか。

>class Function
>   def initialize(hash={},*parameter)
>     @hash=hash
>     @para=parameter
>     @lambda=eval "lambda{"+yield+"}"
>   end
>   def [](x)
>     @hash[x] || @hash[x]=@lambda.call(x,*@para)
>   end
>end
>
>Function.new({0=>1}){"|n| n*self[n-1] "}[5] #=> 120
>Function.new({0=>0,1=>1}){"|n| self[n-2]+self[n-1] "}[10] #=> 55

この Function の色々工夫されていますね。

しかし、lambda の上に eval までされると、いよいよ頭がぐちゃぐちゃ
に、、、(^^;

ブロックの中で、そのブロックを表す(疑似)変数があると、便利かも
しれませんね。現状だとこんな感じになりますか。

   def proc2(&f)
     def f.[](x); call(self, x); end
     f
   end
   p proc2{|selF, n| n == 0 ? 1 : n * selF[n-1]}[5] #=> 120