develooper Front page | perl.perl6.compiler | Postings from April 2006

Re: Infix macro := reparsing the LHS?

Thread Previous
From:
Larry Wall
Date:
April 19, 2006 11:44
Subject:
Re: Infix macro := reparsing the LHS?
Message ID:
20060419184357.GA13263@wall.org
After some discussion on IRC, we have all declarators implying a signature
syntax, either with parens for full sig or without for a limited one arg
syntax:

    my Int $x = 1;
    my (Int $x where Odd, Dog $spot = fido()) := (1,$lassie);

The sigil or the parens still control the context of the right side in
the case of assignment, but the listop form of either = or := causes the
right side to parse as a list argument that doesn't need parens, just as
with ordinary list operators.  The scalar form is unaffected, so

    loop($a = 1, $b = 2; ; $a++, $b++) {...}

still works.

In the case of

    my ($a, $b, $c) = 1,2,3;

the left side is parsed as a signature and "degrades" to an ordinary lvalue
list, but since "my" already restricts what can occur in such a list, that's fine.

If you wish to bind to a signature without a declarator, you have to use
the colon form of sig:

    :($a,$b,$c) := 1,2,3;

Assignment to a sig does binding but maintains copy semantics so that

    my $a = $b;
    my ($a,$c) = $b,$d;

do not alias, and

    :($a,$b) = $b,$a

swaps values rather than clobbering one of them, because the binding is to
temp copies.

my $a, $b, $c;

is still an error, generally caught by the fact that $b hasn't been declared.

I'm sure I've left out something important...

Larry

Thread Previous


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