Father Chrysostomos pointed out:
> I said when, not whether. :-)
Isn't that just typical of me: confusing ontology with chronology. ;-)
I'm afraid don't know the implementation details for Rakudo. It may be
bound as the surrounding block is entered, or perhaps just-in-time when
the Code object is first accessed in some way.
> Does Perl 6 have an equivalent to this?
>
> my $x;
> for $x(1..10) {}
In Perl 6 that's:
my $x;
for 1..10 -> $x {}
And, as in Perl 5, they're two separate variables.
The iterator $x is a parameter of the loop block and acts as a readonly
alias to each successive iterated value, unless you write:
for 1..10 <-> $x {}
in which case it's a read-write alias to each iterated value.
Loop iterators are never package-scoped in Perl 6.
> is just a syntactic convenience for:
>>
>> my &foo := sub { whatever() }
>
> Except that my sub foo happens upon block entry, right?
Quite so. So the equivalence is more precisely:
ENTER my &foo := sub { whatever() };
except that the named code object is visible throughout its surrounding
block (even before its declaration point).
So I guess that equivalence I keep referring to is a little shakey. ;-)
> In Perl 5, $] in a piece of code is bound to *], not $], so it sees
> changes made by local($]) (which actually puts a completely new scalar
> in the *]{SCALAR} slot). But ‘my $x; sub { $x }’ is bound, not to the
> $x slot in the outer block/sub/file, but to the actual scalar itself.
>
> It seems that Perl 6 closures close over the slot, not the
> scalar/array/etc. Is that right?
That's right. This:
my $x = 1;
my $x_prime = -1;
sub foo { say $x }
foo();
$x := $x_prime;
foo();
prints:
1
-1
...indicating that the $x in foo is bound to the slot, not to any var
implementation currently in the slot. The way I would have described it
is that binding is by name, not by reference.
Damian