XP is just a number PerlMonks

### Re^2: recursive anonymous subroutines

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

in reply to Re: 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);
..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;
}, \$_);
s/make_call/Y/?
```sub Y {goto \$_[0] };

Create A New User
Node Status?
node history
Node Type: note [id://542085]
help
Chatterbox?
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
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Should cpanminus be part of the standard Perl release?

Results (118 votes). Check out past polls.

Notices?