Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^3: closures: anonymous subs vs function templates?

by Athanasius (Archbishop)
on Dec 22, 2014 at 03:17 UTC ( [id://1110988]=note: print w/replies, xml ) Need Help??


in reply to Re^2: closures: anonymous subs vs function templates?
in thread closures: anonymous subs vs function templates?

Hello Laurent_R,

You understood me correctly, and it appears I was wrong: you have shown that it is possible to build a closure using function templates. But I note that, to get the syntax to work, you had to remove the local from the definition of *inner within sub make_adder, and that makes *inner a package global sub. In fact, what sub make_adder returns is simply the string *main::inner. So we can dispense with make_adder’s return value and the assignments to *f1 and *f2 altogether:

#! perl use strict; use warnings; use v5.14; make_adder(20); say inner(10); make_adder(25); say inner(10); sub make_adder { my $addpiece = shift; print "\$addpiece = $addpiece\n"; *inner = sub { return shift() + $addpiece; }; }

Output:

13:02 >perl 1102_SoPW.pl $addpiece = 20 30 $addpiece = 25 Subroutine main::inner redefined at 1102_SoPW.pl line 15. 35 13:02 >

This approach is inferior to the standard technique (references to anonymous subroutines) in at least two ways:

  1. Each call to make_adder creates a new closure, and the previous closure is no longer available (hence the warning message).
  2. The memory allocated to $addpiece will never be garbage collected as long as the script is running.

Hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Replies are listed 'Best First'.
Re^4: closures: anonymous subs vs function templates?
by 5haun (Scribe) on Dec 22, 2014 at 04:10 UTC

    In my function template example, I put the local in front of *inner for just that reason - to limit the scope of inner to the block in which it is defined for the purposes of both limiting access and improving garbage collection.

    I appreciated the conversation all of these examples has created. I've learned a few things in the process. I thank all of you who have contributed this analysis.

Re^4: closures: anonymous subs vs function templates?
by Laurent_R (Canon) on Dec 22, 2014 at 07:56 UTC
    I of course did not want to promote function templates for such use cases, but just tried to see how they could work out. I definitely agree that the approach with references to anoonymous subroutines is vastly superior, especially in view of your first remark: a new closure is destroying the previous one.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (6)
As of 2024-03-29 06:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found