use v5.20;
sub Y { my $f = shift;
sub {$f->(Y($f))->(@_)}
}
my $factorial = sub {my $f = shift;
sub {my $n = shift; $n < 2 ? 1 : $n * $f->($n-1)}
};
my $fibonacci = sub {my $f = shift;
sub {my $n = shift; $n == 0 ? 0 : $n == 1 ? 1 : $f->($n-1) + $f->($n-2)}
};
sub fibonacci {
my $n = shift;
$n == 0 ? 0 : $n == 1 ? 1 : __SUB__->($n-1) + __SUB__->($n-2)
}
my $fib = sub { \&fibonacci } ;
say join "\n", map fibonacci($_) , 1..5;
say "==============";
say Y($factorial)->($_) for 1 .. 5;
say "==============";
say Y($fib)->($_) for 1 .. 5;
say "==============\n\n\n";
say "NOW BIG TIME" ;
say "==============\n\n\n";
for my $f ($factorial, $fibonacci, $fib) {
say join "\n", map Y($f)->($_), 1 .. 20;
}
print "\n", Y( sub{ \&fibonacci } )->($_) for 1 .. 10;