Vim script の lambda で Yコンビネータ

Vim script の lambda では変数がキャプチャ出来ないので無理やりですが。

let Y = { f -> function({ f -> call(f, [f] + a:000) }, [f]) }
let Fact = Y({ f, x -> x == 1 ? 1 : f(f, x-1) * x })
echo Fact(5)
" => 120

[使用した vim のバージョン]

  • 7.4.2067