On Wed, Apr 19, 2006 at 10:08:29PM +0800, Audrey Tang wrote:
: Not sure if this is p6l or p6c... Fallback to the latter. :)
: 
: In this line:
: 
:    [Dog ::T $ ($x) where 1, *$, [EMAIL PROTECTED] := moose();
: 
: the left hand side is probably not a valid Perl 6 expression, yet
: according to the current spec, it needs to be parsed implicitly as if a
: :() is around it.
: 
: How does this work in practice? Is an infix macro allowed to change the
: "is parsed" of its LHS? Should that trigger a reparse, or do we use
: (potentially costly) prescanning?

>From S06:

    (This means, for instance, that an infix
    operator can change the parse rules for its right operand but not
    its left operand.)

: A way out of this may be requiring :() on the LHS of :=, and treat it as
: an infix macro that only changes how the RHS is parsed (which would be
: trivial). Or, for symmetry, make := ordinary infix, and require both
: side to be :() and \() respectively.

That seems excessive, since we don't require people to \ their ordinary
argument lists.  There's a sense in which all = and := thingies are just
postfix list metaoperators.  That is

    ($x, $y) = ($y, $x)

is more like

    \($x,$y).assign($y,$x);

And we could drive that list operator-ness as far as to make the right side
of = or := a list, so that you could get away with

    ($x, $y) = $y, $x

as pugs currently allow for

    my ($x, $y) = $y, $x

I dislike that inconsistency, but we could make it consistent either
way.  (For the rest of the discussion I'll assume that := parses like a
listop, that is, with a different precedence leftward than rightward.)

: I agree that
: 
:     ($x, $y) := ($y, $x)
: 
: is clean (and featured in various places).  However, as long as there
: are some Signature forms that isn't valid expression form, or would
: triggered parse-time expression-form macros that wouldn't trigger in
: Signature forms, I can't figure out how it would work.

Could we say that :() is required if there is anything in the signature besides
a list of variables?  Or we could go one step further and say that anything
that parses correctly as an rvalue but can be trivially transformed into a
signature is allowed, which gives us [EMAIL PROTECTED] and maybe a few other 
things.

Another approach would be to deem that (Type starts a signature,
but that may be too unclean and/or not general enough.

: The infix:<=> has no such problem because all valid lvalue expressions
: are also valid rvalue expressions in Perl 6.

If assignment to a signature binds (a big "if" given human factors),
then we could just say you have to put the colon in either place:

    :($x, $y) = $y, $x
    ($x, $y) := $y, $x

But the conservative thing to say right now is that you this is guaranteed
to work:

    :($x, $y) := $y, $x

We can always relax it later.  Once again, we see that ASCII just doesn't
have enough brackets, or we could say something like

    ⦇$x, $y⦈ := $y, $x
    ❲$x, $y❳ := $y, $x
    ⟦$x, $y⟧ := $y, $x
    ⦅$x, $y⦆ := $y, $x

and then we don't feel like we're being redundant.

Oh, another thing we haven't really settled is whether Sig ~~ Cap actually
binds the variables in Sig or just tells you whether they *would* bind.
Or equivalently, just binds them vacuously over a null scope, suggesting
that it could be adverbed with a block thus:

    Sig ~~ Cap :{...}
    Cap ~~ Sig :{...}

making those equivalent to:

    -> Sig {...}.Cap

But I know if I start thinking about switches now my head will explode:

    given Sig { when Cap :{...} {...} }
    given Cap { when Sig :{...} {...} }

especially if anyone suggests that

    given Sig { when Cap  {...} }
    given Cap { when Sig  {...} }

should implicitly bind over the scope of the inner block.

Larry

Reply via email to