Y combinator

http://www.loveruby.net/ja/misc/ycombinator.html
昼休みの息抜きに。とりあえず写経。

fact0 = lambda {|f|
  lambda {|n|
    if n.zero?
      1
    else
      n * f.call(n - 1)
    end
  }
}

y = lambda {|f0|
  lambda {|f|
    f0.call(lambda {|arg| f.call(f).call(arg)})
  }.call(
    lambda {|f|
      f0.call(lambda {|arg| f.call(f).call(arg)})
    }
  )
}

puts y.call(fact0).call(5) # => 120