lua で Y コンビネータ

ところで lua で Y コンビネータを書いてみた。

function Y(f) return function(a) return f(Y(f), a); end; end 
f = Y(function(f, n) if n <= 0 then return 1 else return n*f(n-1); end; end)
f(10)  # => 3628800

ふむふむ。

これを複数引数にするにはどうするか。とりあえず可変長引数を利用してみるがもうひとつ上手くない。もっと良い手がある気がするが、可変長引数を多値にして渡す方法がよくわからん。いったん可変長引数にしてしまうと多値にはならない気がする。

Y = function(f) return function(...) return f(Y(f), arg); end; end
f = Y(function(f, tbl) local n = tbl[1]; local res = tbl[2]; if n <= 0 then return res else return f(n-1, n*res); end; end)
f(10, 1) # => 3628800

うーん、もうひとつ美しくないなぁ。最大限の見積を考慮して10コくらいあらかじめ Y コンビネータ側で引数を持っておく手しかないのかな?

Y = function(f) return function(a, b, c, d, e) return f(Y(f), a, b, c, d, e); end; end
f = Y(function(f, n, res) if n <= 0 then return res else return f(n-1, n*res); end; end)
return f(10, 1)
3628800

引数上限5コ版。うーん美しくない。