http://www.perlmonks.org?node_id=542085


in reply to Re: recursive anonymous subroutines
in thread recursive anonymous subroutines

"What's wrong storing a reference to an anonymous inner sub in an anonymous outer closure?"
It's a recursive, i.e. leaking, reference.

Replies are listed 'Best First'.
Re^3: recursive anonymous subroutines
by snoopy (Curate) on Apr 10, 2006 at 04:28 UTC
    It's a recursive, i.e. leaking, reference.

    Hmm... probably safer to keep the reference on the call stack, thus releasing it on exit.

    For example, adopting the convention that the reference is always passed as the first parameter:

    my @factorials = map { $_[0] ||= sub { my $factor = pop; return $factor > 1 ? &{$_[0]}($_[0],$factor-1) * $factor : 1; }; &{$_[0]}($_[0],$_)} (3,5,7,9);
    ..or..
    sub make_call { goto $_[0]; } my @factorials = map { make_call (sub { my $factor = $_[1]; return $factor > 1 ? make_call($_[0], $factor-1) * $factor : 1; }, $_); } (3,5,7,9);
      Very nice! I believe your make_call version will shortly become a new idiom in my code. Many thanks!
      Just thought I'd point out that this is an interesting reinvention of a previous post (though with one less level into the call stack due to the goto). Compare:
      # Your's: sub make_call { goto $_[0] } # Anonymonk's(slightly rearranged): sub Y { $_[0]->(@_) }
      Update: Well, it's more the same if you change your call to:
      make_call (sub { my $factor = $_[1]; return $factor > 1 ? $_[0]->($_[0], $factor-1) * $factor : 1; }, $_);