use v5.14; #my $fact = sub { (sub { goto &{$_[0]} })->(sub { $_[1] ? $_[1] * $_[0]($_[0], $_[1]-1) : 1 }, $_[0]) }; #my $fact = sub { (sub { $_[0]($_[0], $_[1]) })->(sub { $_[1] ? $_[1] * $_[0]($_[0], $_[1]-1) : 1 }, $_[0]) }; my $auto_fact = sub { my ($self, $value) = @_; return 1 unless $value > 1; return $value * $self->($self, $value - 1); }; my $auto_fib = sub { my ($self, $rank) = @_; return 1 unless $rank > 1; return $self->($self, $rank - 1) + $self->($self, $rank - 2); }; say "Test auto fact: $_!=", $auto_fact->($auto_fact, $_) for 5, 6, 10; say "Test auto fib: ", join ", ", map { $auto_fib->($auto_fib, $_) } 0..10; my $transformator = sub { my ($auto_fun,) = @_; return sub { $auto_fun->($auto_fun, @_) } }; *fib = $transformator->($auto_fib); say "Test fib: ", join ", ", map fib($_), 0..10; *fact = (sub { my ($auto_fun,) = @_; sub { $auto_fun->($auto_fun, @_) } })->( sub { my ($self, $value) = @_; $value ? $value * $self->($self, $value - 1) : 1 } ); say "Test fact: $_!=", fact($_) for 3, 4, 5;