Mike Lambert asked:
> 
> > It's also unnecessary. The Holy Scoping Rules actually work in your favour in
> > this case. In Perl 6 you can just do this:
> >
> >
> >       while my $cond = blah() {
> >               ...
> >       }
> >
> > and C<$cond> is defined *outside* the block.
> 
> Question then. Does the following code compile?
> 
> while my $i = getNextValue() {
> }
> 
> ...
> 
> while my $i = getOtherNextValue() {
> }

Yes, it compiles. But you get warnings about two lexical C<$i>'s being
declared in the same scope.

 
> Does it fail due to scoping $i twice within the same enclosing block, or
> is it sort of like a Scheme/OCaml interpreter where each definition
> creates a scoping for all the lines that follow it, and the second 'my $i'
> merely hides the $i scoped in the 'outer' scope.

The latter. As Perl 5 does now.

And yes, it's annoying.

However, it won;t be an issue in Perl 6. The correct idiom in Perl 6 will 
almost certainly be:

        while getNextValue() -> $i {
                ...
        }

        while getOtherNextValue() -> $i {
                ...
        }

which generates no warning because each C<$i> is a parameter of the 
corresponding loop block, and hence scoped to that block.

Damian

Reply via email to