# Ruby 1.8.7 def Y lambda { |f| f.call(f) }.call( lambda do |g| yield(lambda { |*n| g.call(g).call(*n) }) end) end Y { |this| lambda { |n| n == 0 ? 1 : n * this.call(n - 1) } }.call(5) #=> 120