Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > Perl Misc > new "state" variables... nest properly??

Reply
Thread Tools

new "state" variables... nest properly??

 
 
Abble
Guest
Posts: n/a
 
      12-27-2007
Do the new "state" variable declaration stuff mean that finally you
can nest subs and variables will behave properly? Great news, if
true.

My little test program seems to indicate this is correct:

use strict; use warnings; use English; use feature 'state';

my( $GVar );

sub Outer{ my( $Arg ) = @_; state ( $Var );

sub Inner{
if( $GVar eq $Var ) { print "midvar is okay: $Var\n" }
else { print "midvar should be '$GVar' but is '$Var'\n" }
}

#begin Outer

if( $Var ) { print "*** Var preset!!! to '$Var' \n" }
else { print "Var unset as supposed to be!\n" }
$Var = $Arg;
$GVar = $Var;
Inner( );
}


print $];

Outer( 'foo 1' ); Outer( 'foo 2' ); Outer( 'foo 3' );
 
Reply With Quote
 
 
 
 
Ben Morrow
Guest
Posts: n/a
 
      12-27-2007

Quoth Abble <>:
> Do the new "state" variable declaration stuff mean that finally you
> can nest subs and variables will behave properly? Great news, if
> true.
>
> My little test program seems to indicate this is correct:
>
> use strict; use warnings; use English; use feature 'state';
>
> my( $GVar );
>
> sub Outer{ my( $Arg ) = @_; state ( $Var );
>
> sub Inner{


Named subs don't close over lexicals. That hasn't changed. This still
gives a 'Variable '$Var' will not stay shared' warnings, although since
the whole point of state vars is you only get one copy, this is not
terribly useful .

What you are looking for is not state vars, but 'my sub'. There has been
a slot for this in the Perl grammar for a long time, but noone has ever
implemented it.

> if( $GVar eq $Var ) { print "midvar is okay: $Var\n" }
> else { print "midvar should be '$GVar' but is '$Var'\n" }
> }
>
> #begin Outer
>
> if( $Var ) { print "*** Var preset!!! to '$Var' \n" }
> else { print "Var unset as supposed to be!\n" }


This section 'fails': the second time through, $Var is already set,
since it preserves its value from last time Outer was called.

Ben

 
Reply With Quote
 
 
 
 
Abble
Guest
Posts: n/a
 
      12-28-2007
On Dec 27, 5:43 pm, Ben Morrow <b...@morrow.me.uk> wrote:

> This section 'fails': the second time through, $Var is already set,
> since it preserves its value from last time Outer was called.
>
> Ben


yes, the "set locals to empty" bizness goes away, but it seems mid-
level variables now work.
In many cases I'm happy to have tio initialize locals and on exit
leave dangling variables if I get the benefit of being able to access
mid-level vars with impunity. It *seems* like we now have this.



 
Reply With Quote
 
Michele Dondi
Guest
Posts: n/a
 
      12-28-2007
On Thu, 27 Dec 2007 23:43:32 +0000, Ben Morrow <>
wrote:

>What you are looking for is not state vars, but 'my sub'. There has been
>a slot for this in the Perl grammar for a long time, but noone has ever
>implemented it.


For the record I had asked this quite some time ago:

http://perlmonks.org/?node_id=489881

To which dave_the_m replied:

: The perl5 parser has had a placeholder for lexical subs for quite a
: while [...] and a pad can quite happily accomodate them.
: The main things holding them up has been trying to agree their
: semantics, then someone - probably me - finding the time to implement
: them .

Actually, I included it in my 5.12 wishlist @ PM:

http://perlmonks.org/?node_id=634043

Funnily enough, the issue has popped up again in a vaguely related
thread exactly today:

http://perlmonks.org/?node_id=659258


Michele
--
{$_=pack'B8'x25,unpack'A8'x32,$a^=sub{pop^pop}->(map substr
(($a||=join'',map--$|x$_,(unpack'w',unpack'u','G^<R<Y]*YB='
..'KYU;*EVH[.FHF2W+#"\Z*5TI/ER<Z`S(G.DZZ9OX0Z')=~/./g)x2,$_,
256),7,249);s/[^\w,]/ /g;$ \=/^J/?$/:"\r";print,redo}#JAPH,
 
Reply With Quote
 
Ben Morrow
Guest
Posts: n/a
 
      12-28-2007

Quoth Michele Dondi <>:
> On Thu, 27 Dec 2007 23:43:32 +0000, Ben Morrow <>
> wrote:
>
> >What you are looking for is not state vars, but 'my sub'. There has been
> >a slot for this in the Perl grammar for a long time, but noone has ever
> >implemented it.

>
> For the record I had asked this quite some time ago:
>
> http://perlmonks.org/?node_id=489881
>
> To which dave_the_m replied:
>
> : The perl5 parser has had a placeholder for lexical subs for quite a
> : while [...] and a pad can quite happily accomodate them.
> : The main things holding them up has been trying to agree their
> : semantics, then someone - probably me - finding the time to implement
> : them .


It would be rather awkward, as lots of code of the Clone/PadWalker type
assumes that anon <=> closure <=> '&' slot in a pad, and it would all
need to be changed.

What *I've* wanted for some time are lexical packages, or rather lexical
class names, but I don't think that would be possible as things like
->isa would break.

Ben

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
How to nest 2nd datalist instead of gridview staeri@gmail.com ASP .Net 0 03-02-2006 02:51 PM
relative sizing does not nest? PJ6 ASP .Net 0 08-15-2005 12:01 AM
Nest Web Projects =?Utf-8?B?UmFlZCBTYXdhbGhh?= ASP .Net 1 07-19-2005 02:45 PM
how to nest CheckBoxList in DataSet ( asp.net vb ) krzysiek ASP .Net 0 10-18-2004 01:33 PM
Nest controls in a MS Treeview Web Control Chad ASP .Net 1 12-18-2003 05:00 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57