Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

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.


Comment on Re^2: recursive anonymous subroutines
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);
    ..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; }, $_);

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://542085]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (6)
As of 2014-10-30 23:03 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (211 votes), past polls