package main
import "fmt"
type x_f func (a x_f) (func (a int) int)
func Y(f (func (a (func (a int) int)) (func (a int) int))) (func (a int) int) {
return (
func(proc x_f) (func (a int) int) {
return f(
func (arg int) int {
return (proc(proc))(arg)
}
)
}(
func (proc x_f) (func (a int) int) {
return f(
func (arg int) int {
return (proc(proc))(arg)
}
)
}
)
)
}
func fact0 (f (func (a int) int)) (func (a int) int) {
return (
func (n int) int {
fmt.Printf("* %d\n", n);
if n == 0 {
return 1
}
return n * f(n - 1)
}
)
}
func main() {
var a int = (Y(fact0))(5);
fmt.Printf("%d\n", a)
}