develooper Front page | perl.perl6.language | Postings from December 2001

Re: Apropos of nothing...

Thread Previous | Thread Next
From:
Damian Conway
Date:
December 20, 2001 12:32
Subject:
Re: Apropos of nothing...
Message ID:
3C22461B.C1C968BB@conway.org
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

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About