accumulate
世の中ではaccumulateが流行っているらしいので(ひげぽんさんとtociyukiさん)、最近のラムダ遊びで私もaccumulateしてみます。
Add = lambda{|x, y| x + y} Call = lambda {|f, *a| f[f, *a]} Sequence = lambda {|xs, *a| lambda { return a[0], Call[xs, *a] } } OfGiven = lambda {|s, *a| Sequence[s, *a[1..-1]]} Accumulate = lambda {|op, accx, xs| Call[ lambda {|f, accx, xs| y, ys = xs[] return accx unless y f[f, op[accx, y], ys] }, accx, xs ] } p Accumulate[Add, 0, Sequence[OfGiven, 1, 2, 3, 4, 5]] #=> 15
無駄に面倒にしているような気もする。てへ♪