Quickcheck of context of index expressions

2 views
Skip to first unread message

Autrijus Tang

unread,
Apr 25, 2005, 3:33:44 PM4/25/05
to perl6-l...@perl.org
Another quick check on expression context for indexed expressions.
Please sanity-check the return value of want() below:

@x[0] = want(); # scalar context
@x[want()] = $_; # scalar context
@x[want()] = @_; # scalar context
@x[0,] = want(); # list context
@x[want(),] = $_; # list context
@x[want(),] = @_; # list context
$_ = @x[want()]; # scalar context
@_ = @x[want()]; # list context

Thanks,
/Autrijus/

Autrijus Tang

unread,
Apr 25, 2005, 3:56:37 PM4/25/05
to Autrijus Tang, perl6-l...@perl.org

Oh, and under the S02 rules above (the index expression inherits
outer context on RHS), Pugs currently does this:

$_ = %x{ 1, 2 }
--- reduces to ---
$_ = %x{ [1, 2] }
--- reduces to ---
$_ = %x{ "1 2" }

Which is, well, very surprising. Where did I get wrong?

Thanks,
/Autrijus/

Autrijus Tang

unread,
Apr 29, 2005, 9:37:30 AM4/29/05
to perl6-l...@perl.org
On Fri, Apr 29, 2005 at 06:22:57AM -0700, Larry Wall wrote:
> : @x[want()] = $_; # scalar context

> : @x[want()] = @_; # scalar context
>
> Maybe "unknown" context, which defaults to list.

I think allowing unknown LHS index expression to default to
scalar context is a bit more useful here. Since we have:

@x[0] = @y; # scalar
@x[0,] = @y; # list

This may be more intuitive:

@x[idx()] = @y; # scalar
@x[idx(),] = @y; # list

Than this:

@x[+idx()] = @y; # scalar
@x[idx()] = @y; # list

But I don't really feel strongly one way or another, as long
as it is specced down. :)

Thanks,
/Autrijus/

Larry Wall

unread,
Apr 29, 2005, 9:22:57 AM4/29/05
to perl6-l...@perl.org
On Tue, Apr 26, 2005 at 03:33:44AM +0800, Autrijus Tang wrote:
: Another quick check on expression context for indexed expressions.

: Please sanity-check the return value of want() below:
:
: @x[0] = want(); # scalar context

Good.

: @x[want()] = $_; # scalar context


: @x[want()] = @_; # scalar context

Maybe "unknown" context, which defaults to list.

: @x[0,] = want(); # list context


: @x[want(),] = $_; # list context
: @x[want(),] = @_; # list context
: $_ = @x[want()]; # scalar context
: @_ = @x[want()]; # list context

No, I think they're all list context.

Larry

Larry Wall

unread,
Apr 29, 2005, 9:27:35 AM4/29/05
to perl6-l...@perl.org
On Tue, Apr 26, 2005 at 03:56:37AM +0800, Autrijus Tang wrote:

I think S02 is probably wrong. It should be unknown/list context.

Sorry for the short answers, but I'm in Russia behind a flakey network
connection, which is probably going away entirely at any moment (the
network connection, not Russia.) I can clarify more next week when
I get back.

Larry

Autrijus Tang

unread,
Apr 29, 2005, 11:20:52 AM4/29/05
to perl6-l...@perl.org
On Fri, Apr 29, 2005 at 06:22:57AM -0700, Larry Wall wrote:
> : @x[want()] = $_; # scalar context
> : @x[want()] = @_; # scalar context
>
> Maybe "unknown" context, which defaults to list.
>
> : @x[0,] = want(); # list context
> : @x[want(),] = $_; # list context
> : @x[want(),] = @_; # list context
> : $_ = @x[want()]; # scalar context
> : @_ = @x[want()]; # list context
>
> No, I think they're all list context.

Okay. r2478 has them reverted to the original form, which
inspects the declared return type of want() to see if it is a subtype
of Scalar; if it is, then it is taken as scalar context;
otherwise (or if multiple multisubs are possible), it defaults
to list context.

Thanks,
/Autrijus/

Reply all
Reply to author
Forward
0 new messages