y = lambda do |f|
  lambda {|g| g[g]}[lambda do |g|
      f[lambda {|*args| g[g][*args]}]
    end]
end

fac = lambda{|f| lambda{|n| n < 2? 1: n * f[n-1]}}
p Array.new(10) {|i| y[fac][i]}   

fib = lambda{|f| lambda{|n| n < 2? n: f[n-1] + f[n-2]}}
p Array.new(10) {|i| y[fib][i]}