SKIコンビネータでSKK = I(Ruby版)そのよん
ブロックの引数の数から入れ子の回数がわかるので、nlambdaの引数nは別にわざわざ指定しなくてもいいことに気が付きました。
それはそれとして、Proc#arityのarityの語源って何なんでしょ? 他言語でも引数の数を表現するのにarityって使っているみたいなんだけど。
def nlambda(n = -1, xs = [], &f) n = f.arity if n < 0 if n == 0 f[*xs] else lambda {|x| nlambda(n - 1, xs + [x], &f) } end end class Proc def *(x) self[x] end end I = nlambda {|x | x } K = nlambda {|x, y | x } S = nlambda {|x, y, z| x[z][y[z]] } p S * K * K * 100 == I * 100 # => true