Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister

Re: (tye)Re2: A Real Closure

by dragonchild (Archbishop)
on Jul 13, 2001 at 01:41 UTC ( #96200=note: print w/replies, xml ) Need Help??

in reply to (tye)Re2: A Real Closure
in thread Unusual Closure Behaviour

I think that the important thing about closures is being able to call the same code but have it use different variables (without passing them in as arguments). Above, only the anonymous subroutine and "insert" meet that criterion. So those are what I'll call closures.

What do you mean by this? I think I'm missing something when it comes to closures...

Replies are listed 'Best First'.
(tye)Re3: A Real Closure
by tye (Sage) on Jul 13, 2001 at 02:58 UTC

    A "classic" example of closures goes something like this:

    sub generateSequencer { my( $start, $inc )= @_; $start -= $inc; return sub { return $start += $inc; }; } my $countByTwos= generateSequencer( 0, 2 ); print $countByTwos->(), $/ for 1..3; my $countByThrees= generateSequencer( 1, 3 ); print $countByTwos->(), " ", $countByThrees->(), $/ for 1..4;
    which generates the output:
    0 2 4 6 1 8 4 10 7 12 10

    So we have $countByTwos and $countByThrees are both references to the code: sub { return $start += $inc; };
    except that the code reference $countByTwos has hidden inside of it references to the $start and $inc that were created when generateSequencer was called the first time while $countByThrees has hidden inside of it references to the other $start and $inc (that were created when generateSequencer was called the second time).

    So both of those code references end up using the same code, but they each end up using different variables even though we don't pass any variables at all as arguments in here: print $countByTwos->(), " ", $countByThrees->(), $/

            - tye (but my friends call me "Tye")
Re: Re: (tye)Re2: A Real Closure
by petral (Curate) on Jul 13, 2001 at 04:22 UTC
    Ok, I'll try (though see John M. Dlugosz's answer just above):
    > perl -lwe'sub k{my $x; sub j{++$x}; return sub{++$x} } k(); $a=\&j; k(); $b=\&j; $c=k(); $d=k(); print"a b c d"; $,=$"; print &$a, &$b, &$c, &$d for 0..2' Variable "$x" will not stay shared at -e line 1. a b c d 1 2 1 1 3 4 2 2 5 6 3 3 >
    That is a and b are just two references to the same function and its (compiled-in) variable. c and d refer to different functons (with the same code) each with its own (run-time declared) variable.

    c and d are closer to what is referred to elsewhere as closures. (Not everywhere else, the original usage in set theory is yet another thing.)

    update Obviously I didn't reload the page before submitting. I thought tye had left, so it would be safe to try to answer without being compared to his much more complete answers. I'll leave mine up anyway, in the hope that repetition aids understanding.


Log In?

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

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (6)
As of 2017-04-28 12:21 GMT
Find Nodes?
    Voting Booth?
    I'm a fool:

    Results (521 votes). Check out past polls.