sub { local ($x) = @_; $x->($x) }->( sub {
$h->(sub { local @args = @_; $g->($g)->(@args) }) }
)
};
local $trampoline = sub { sub {
local $result = $f->(@args); while (ref($result) eq 'CODE') { $result = $result->();
}
$result
}
};
$trampoline->(
$Y->(sub {
sub {
$n == 0
? $acc
: sub { $f->($n - 1, $n * $acc) }
}
})
)->($n, 1)
};
bG9jYWwgJFkgPSBzdWIgewogICAgbG9jYWwgKCRoKSA9IEBfOwogICAgc3ViIHsgbG9jYWwgKCR4KSA9IEBfOyAkeC0+KCR4KSB9LT4oCiAgICAgICAgc3ViIHsKICAgICAgICAgICAgbG9jYWwgKCRnKSA9IEBfOwogICAgICAgICAgICAkaC0+KHN1YiB7IGxvY2FsIEBhcmdzID0gQF87ICRnLT4oJGcpLT4oQGFyZ3MpIH0pCiAgICAgICAgfQogICAgKQp9OwoKbG9jYWwgJHRyYW1wb2xpbmUgPSBzdWIgewogICAgbG9jYWwgKCRmKSA9IEBfOwogICAgc3ViIHsKICAgICAgICBsb2NhbCBAYXJncyA9IEBfOwogICAgICAgIGxvY2FsICRyZXN1bHQgPSAkZi0+KEBhcmdzKTsKICAgICAgICB3aGlsZSAocmVmKCRyZXN1bHQpIGVxICdDT0RFJykgewogICAgICAgICAgICAkcmVzdWx0ID0gJHJlc3VsdC0+KCk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQKICAgIH0KfTsKCmxvY2FsICRmYWMgPSBzdWIgewogICAgbG9jYWwgKCRuKSA9IEBfOwogICAgJHRyYW1wb2xpbmUtPigKICAgICAgICAkWS0+KHN1YiB7CiAgICAgICAgICAgIGxvY2FsICgkZikgPSBAXzsKICAgICAgICAgICAgc3ViIHsKICAgICAgICAgICAgICAgIGxvY2FsICgkbiwgJGFjYykgPSBAXzsKICAgICAgICAgICAgICAgICRuID09IDAKICAgICAgICAgICAgICAgICAgICA/ICRhY2MKICAgICAgICAgICAgICAgICAgICA6IHN1YiB7ICRmLT4oJG4gLSAxLCAkbiAqICRhY2MpIH0KICAgICAgICAgICAgfQogICAgICAgIH0pCiAgICApLT4oJG4sIDEpCn07CgpwcmludCAkZmFjLT4oNSksICJcbiI7