Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number

Re^2: recursive anonymous subroutines

by Anonymous Monk
on Apr 08, 2006 at 21:51 UTC ( #542085=note: print w/replies, xml ) Need Help??

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 (Deacon) 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);
    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; }, $_);

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://542085]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (5)
As of 2018-06-21 19:39 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (118 votes). Check out past polls.