正木です。
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
といったこともできて便利だと思いますが。