Ruby
tricks

Ruby で無名 lambda 再帰

More than 5 years have passed since last update.

ラムダ式を再帰させたいと思ったことは誰にでもあると思います。

そんな時、以下のような Proc オブジェクト拡張を行います。

class Proc

def self_curry
self.curry.call(self)
end
end

すると、lambda のオブジェクトに sef_curry メソッドが追加されるので、xの階乗を求める無名関数は以下のように書けます。

lambda{|f,x| x == 1 ? 1 : x * f.call(f, x-1) }.self_curry.call(5)

=> 120

すばらしい。

第一引数として「自分自身」を受け取る無名関数となっているのがポイントです。

self_curry の呼び出しによって python のメソッドっぽく自分自身が第一引数にバインドされるようになります。