正木です。

block 内の変数の問題については、変数の scope のこと以外に、私にとっては
重要な問題がもう一つあります。

今仮に
{ <x> ・・・ }
で block 内の変数の local 性が保証されたとしても

class Sequence
  def initialize(list=[],*parameter)
    @list=list
    @para=parameter
    @lambda=eval "lambda{"+yield+"}"
  end

  def [](n)
    @list[n] || @list[n]=@lambda.call(n,*@para)
  end
end

Fact=Sequence.new([1]){"|n| n*self[n-1]"}

を

class Sequence
  def initialize(list=[],*parameter,&block)
    @list=list
    @para=parameter
    @lambda=block
  end
end

で置き換えるためには

Fact=Sequence.new([1]){<n> n*self[n-1]}

の self が Fact を指してくれないと困ります。

そこで提案ですが、

block が 
object.method(){<x> ...}
の形のとき、その中での self は、その method を呼んだ object を
指す。

というのは如何でしょうか。

上記の例では、この block が渡される initialize
を呼んでいるのは Fact であると解釈して(self=Sequence ではなく)
self=Fact
ですが無理ですか?

上記の仕様が採用されれば
Proc.new{<n> (n==0)? 1: n*self[n-1]}[5] => 120
といったこともできて便利だと思いますが。