On Thu, May 05, 2005 at 07:50:31PM +0200, Ingo Blechschmidt wrote:
: Hi,
:
: sub gen() {
: state $svar = 42;
: # Only initialized once, as it is (per S04) equivalent to
: # state $svar will first{ 42 };
: return { $svar++ };
: }
:
: my $a = gen();# $svar == 42
: $a(); $a(); # $svar == 44
: my $b = gen();# $svar == 44
: say $b(); # 44
: # $svar == 45
:
: I presume that's correct.
Yes. Though I'm not quite sure if we've nailed down whether the will
form will auto-assign or would instead have to be written
state $svar will first { $_ = 42 }
I think the latter is probably correct. However, you should be able
to write the non-closure form to auto-assign in any event:
state $svar is first(42)
: Is the following correct, too?
:
: sub gen() {
: (state $svar) = 42;
: # Initialized on each invocation of gen, as it is equivalent to
: # (state $svar will first{ undef }) = 42;
: # I.e. $svar is only set to undef once (as $svar is a state
: # variable), but it is set to 42 each time gen is called. Correct?
: return { $svar++ };
: }
:
: my $a = gen();# $svar == 42
: $a(); $a(); # $svar == 44
: my $b = gen();# $svar == 42
: say $b(); # 42
: # $svar == 43
Depends on whether assignment to a state variable is recognized in
syntactic analysis (where parens count) or semantic analysis (where they
don't). You're taking the syntactic approach. It can be argued that
the semantic approach is more robust, insofar as it makes all of
these equivalent:
state $a = 1; state $b = 2;
state ($a,$b) = (1,2);
(state $a, state $b) = (1,2);
just as
my $a = 1; my $b = 2;
my ($a,$b) = (1,2);
(my $a, my $b) = (1,2);
should all be equivalent. On the other hand, don't ask me when
(my $a, state $b) = (1,2);
should evaluate its RHS. The semantic analyzer should probably throw
up its hands in disgust if it sees conflicting requirements for =.
Or we could make assignment policy depend on the outside of the parens
as you're doing. In that case
my ($a, state $b) = (1,2);
might initialize $b every time, while
state ($a, my $b) = (1,2);
would only initialize $b the first time. Hmm, then you could write
state (my $first) = 1;
and $first would be true only the first time though. Not sure if that's
terribly useful. On the other hand,
state (our $x) = 1;
would have the same effect as
our $x is first(1);
That isn't terribly useful, but I think, for simplicity of analysis,
let's go ahead with your approach and just make the assignment timing
depend only on the declarator outside the parens.
So, yes.
Larry