Aaron Sherman wrote:

> >    > $ref = [1,2];
> >    > @ary[$ref] = foo();      # probably a syntax error
> 
> Ok, as far as I can recall, Larry hinted that arrays and references to
> arrays would be interchangable in many contexts in P6. In this case, I
> can't see any reason that subscripting would *want* to do a SvIV on
> a known reference, so I would expect it to obey that logic and treat
> the reference as an array. Thus, I expect this to be list context for
> the exact same reason that:
> 
>         @bar = (1,2);
>         @ary[@bar] = foo();
> 
> would be.

The problem is *when* perl determines the context. If it's at compile-time,
then  you can't say what $ref contains, so you can't conclude anything except
that it will be a scalar value (hence scalar context). Checking it at run-time
will give you the array/ref duality, but there's likely to be a *major*
performance hit if every use of a variable subscript has to be run-time
checked for context. 

Hence, I suspect the rule will be something like: if it's identifiably an
array, list, or array ref at compile-time, it's a slice (and hence list
context); otherwise, it's a single element. After all, it's not such a
terrible burden to have to write the above as:

        @ary[@$ref] = foo();

is it?

Of course, if one were to write:

        my $ref is const = [1,2];

or:

        my ARRAY $ref = [1,2];

then $ref *is* compile-time identifiable as an array ref, so you get a slice,
which confers list context.

That's kinda icky.

 
> Next question, though:
> 
>         $val = (foo())[0];
> 
> List?

That would be my expectation. Just as in Perl 5.

Damian

Reply via email to