Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re: Creating Nested Functions

by tilly (Archbishop)
on Jul 10, 2008 at 21:46 UTC ( #696819=note: print w/ replies, xml ) Need Help??


in reply to Creating Nested Functions

One problem with using dynamic scoping is that you've opened up the possibility that the same variable could be used somewhere else for a different purpose. That is the advantage to using lexicals.

Another solution is to use ReleaseAction to do cleanup when you exit the sub.

sub outer { my $helper; $helper = sub { ... }; my $delay_cleanup = on_release {$helper = undef}; $helper->(@_); }
Effectively it does the same thing as the weaken solution, but the code is a little more explicit about what is happening, when. I'd personally lean towards this solution.

And a final option. Larry thinks that using dynamic scoping on lexical variables is too confusing to allow. But he does allow it for data structures. Which leads to the convoluted:

sub outer { my @helper; local $helper[0] = sub { ... }; $helper[0]->(@_); }
I wouldn't suggest this solution for fear of the psychopathic maintenance programmer demanding to know why this works. But every year or two I wind up using this fact in a recursive function to detect and track down potential deep recursion bugs. For instance I'm recursing through a set of nodes and I'll do something like this:
{ my %in_node; sub something_recursive { my $node = shift; if ($in_node{$node->{name}}) { confess("Can't access $node->{name} while accessing $node->{name +}"); } local $in_node{$node->{name}} = 1; ... } }


Comment on Re: Creating Nested Functions
Select or Download Code

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (5)
As of 2014-10-23 06:17 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (124 votes), past polls