On Sun, Dec 05, 2004 at 02:15:51AM +0300, Alexey Trofimenko wrote:
: I thought, its primary use is for closures:
:
: sub test {
: my $a=10;
: return sub { $a++ }
: }
:
: vs
: sub test {
: return sub {state $a=10; $a++ }
: }
:
: $func1 = test;
: $func2 = test;
:
: would closures in $func1 and $func2 share the SAME $a?
No, they're separate.
: or is it that "function cloning" you said?
Yes, except it'd be better to call it "closure cloning".
: oh! that it. I've found example which could make it clear to me
:
: sub test {
: return sub {
: for 1..3 {
: state $var = 1;
: print $var++
: }
: }
: }
:
: $a = test; $a() for 1..3; print ';'
: $b = test; $b() for 1..3;
:
: that could print, for different possible definitions of "state":
: 1) 123123123;123123123
: 2) 123456789;123456789
: 3) 123456789;101112131415161718
:
: looks like you meant third(!) variant.. but it doesn't make any sense for
: me.
I don't know how you even get the third variant. I think it should be 2,
though I see how you'd get 1 if you think a loop clones every time through.
Certainly that one doesn't, since it doesn't refer to any external lexicals.
Perhaps statehood should be limited to "official" subs just like "return" is.
Larry