On Fri, 2002-04-26 at 19:06, Allison Randal wrote:
> On Fri, Apr 26, 2002 at 05:24:13PM -0400, Aaron Sherman wrote:
> > Of course it brings other less wholesome things to mind like "elsfor"
> > and "elsloop" and "if ... elsfor" and "for ... elsif ... elsloop ...
> > else", but why not?
>
> Urk. And why?
>
> Besides, I would expect an C<elsfor> to actually be a loop of it's own,
> on the principle of "elsif = else + if" so "elsfor = else + for".
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.
> Yes, but there's a difference with C<while> in that you wouldn't want an
> "else" to execute anytime the C<while> came across a false value, but
> only if the *first* value it came across was false (i.e. only if the
> loop isn't going to execute at all). Otherwise, you'd just use a LAST
> block (a parallel that I think argues for ELSE blocks).
This is just going up a level in terms of what you're looking at. If I
wrote this:
if (!grep {$_ eq 'foo'} @bar) { ... }
You wouldn't find it confusing that the block only executes if NO
element of the array @bar is 'foo'.
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.
> And C<for> and C<loop> are even more different. You could kind of
> stretch the point and say that the evaluation of the second expression
> is the false value, I'll give you that. But it still has the same
> problem as C<while>.
>
> $i = $somevalue; # possibly set by user input to 5 or higher
> ...
> loop ; $i < 5; $i++ {
> ...
> }
>
> And where's the "false value" here? The "else" would be more of "no
> values to iterate over".
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 can also think of some advantages to having the "else" within the
> > > scope of the loop.
> >
> > while alllines("/etc/passwd") -> $_ {
> > ...
> > } else {
> > die "/etc/passwd: $_";
> > }
>
> 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.
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.