develooper Front page | perl.perl6.language | Postings from December 2004

Re: state vs my

Thread Previous
From:
Alexey Trofimenko
Date:
December 10, 2004 06:52
Subject:
Re: state vs my
Message ID:
opsisrkcvysspxk8@this
On Sat, 4 Dec 2004 22:03:19 -0800, Larry Wall <larry@wall.org> wrote:

> On Sun, Dec 05, 2004 at 02:15:51AM +0300, Alexey Trofimenko wrote:
> : 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.

third variant is what we get if we replace C<state> with perl5 "my $var if  
0" here (not exactly, because $var start value would be undef in that  
case).

> 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.

they must be limited. It would be really strange if

   sub test {
      for 1..3 {
         state $var = 1;
         print $var++
      }
   }
   test();test();

and

   sub test {
      my $a;
      for 1..3 {
         do_something_with($a);
         state $var = 1;
         print $var++
      }
   }
   test();test();

would print different results.

But actually I would prefer if state somehow could be made to work other  
way, even if closure isn't cloned. I mean, first variant, mentioned at top  
of the message. Then we could use state vars in things like:

   # I know that _this_ particular task could be solved better
   # I'm not good in examplification.

   %hash = map {state $k=1; $_ => $k++ } @array;

and always get our keys numbered from 1. And one still get behaviour(2) if  
state declaration is at start of subroutine.
(Hmm, but I can't figure if it is possible )

This applies to FIRST {...} blocks too.

for 1..10 {
   for 1..3 {
     FIRST {...}
     ...
   }
}

I'd expect that FIRST would be fired 10 times, not only once, because  
FIRST looks here just as a mere funny loop control structure.
  and of course I don't want it to happen once here, and 10 times there,  
depending on such a subtle thing as appearance of outer lexical variables  
in inner block. hmm.. but I don't want unnecessary cloning either, if it'd  
slow down my program. I have a cake, please show me where to bite:)

Thread Previous


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About