On Mon, Apr 29, 2002 at 10:10:01AM -0400, Aaron Sherman wrote:
> On Fri, 2002-04-26 at 19:06, Allison Randal wrote:
> 
> Absolutely what I thought. "elsif" would be for "thing else if" where
> "elsfor" would be "thing else for-loop". Since you got this distinction
> right off, it sounds like an intuitive enough syntax.

I'll vote with the others on this. The meaning is only partially
intuitive when you read it. You'll notice that I thought *you* meant
that "elsfor" would be an "else" (i.e. a conditional) tacked onto a
C<for>. And as far as using it, I'd rather not memorize (and teach)
dozens of "compound keywords" and all their subtle nuances when simple
control structures will do.

> So, this should not be confusing either:
> 
>       $i=0;
>       loop ;$i<$max;$i++ { ... } else { ... }
> 
> In this case, if $max <= 0, then you will execute the else.

I agree. 

> Again, it's just first derivative over time. You're not asking "is there
> a false value", you're asking "is the loop false". Just as we understand
> that an array in a conditional context is false if it is empty, so too
> is a loop false if it is "empty". This is a basic Perl concept, and it
> makes sense to promote it from static arrays to more dynamic loops.

I agree again. 

There will have to be a section of the training material devoted to
"When is a loop false?" (I like that perspective, it nicely unifies the
cases), but it should be a short one.

> > But the aliased value, $_, is restricted to the scope of the C<while>'s
> > block, it isn't going to be accessible in the block associated with the
> > C<else> (you would be getting some $_ from an outer scope). 
> 
> You're thinking of loops in a curious and convoluted way, Try this out:
> 
>     { loop-keyword [ conditional/declaration ]
>       block
>       { else-clauses ...} }
> 
> The loop itself comprises an outer scope in which the conditionals or
> declarations exist. Then, each block comprises a sub-scope. In this way,
> there is no confusion, no special case, no violation of the rules.
 
Not so much convoluted as literal-minded on lexical scope being tied to
blocks: { {} } is not the same as { } { }. It could be made to work, but
it would be an exception to Perl's general take on lexical scope.

> It becomes reasonable now to have:
> 
>       for @a -> $b {
>               stuff using $b
>       } elsfor @c -> $d {
>               more stuff using $b and $d
>       } else {
>               yet further stuff with access to $b and $d
>       }
> 
> And what a neophyte programmer might expect about access to variables is
> all true.

Except that, as Damian pointed out, if the C<for> is "false" $b will
never be aliased at all.

Allison

Reply via email to