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

無駄に面倒にしているような気もする。てへ♪