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;