On Tue, Aug 05, 2008 at 05:43:57PM +0800, Audrey Tang wrote:
> John M. Dlugosz 提到:
>> Does that mean that traits can come before the signature?  Or should it 
>> be corrected to
>>     method close () is export { ... }
>
> It's a simple typo.  Thanks, fixed in r14572.

The strange thing is that we might have to support that order if we want
to allow user-defined operators in the signature, since

    sub infix:<foo>
        ($x, $y, :$z = $x foo $y bar 1)
        is equiv(&infix:<baz>)
        {...}

would not know the precedence soon enough to know whether foo is tighter
or looser than bar.  Whereas

    sub infix:<foo>
        is equiv(&infix:<baz>)
        ($x, $y, :$z = $x foo $y bar 1)
        {...}

could presumably attach that information in a timely fashion to the
definition of the foo operator.  'Course, there are workarounds in the
current scheme of things:

    sub infix:<foo>
        is equiv(&infix:<baz>)
        is sig(:($x, $y, :$z = $x foo $y bar 1))
        {...}

    sub infix:<foo>
        ($x, $y, :$z = infix:<foo>($x, $y) bar 1)
        is equiv(&infix:<baz>)
        {...}

but I'm inclined to simplify in the direction of saying the signature
syntax is just a trait variant so the order doesn't matter.  The one
remaining question I see is whether it's possible to declare a sub
with the name "is":

    sub is is foo {...}

and if so, whether it's possible to have an anonymous sub with traits
and no signature:

    sub is foo {...}

I suspect we should bias it towards the first case on the grounds that
you can write the latter with an explicit "missing sig" sig as

    sub ([EMAIL PROTECTED] is rw) is foo {...}

Though, of course, we could solve it the other direction with an
explicit "I am not a sub name" sub name.  Not sure which side least
suprise works on, but the fact that we already have a representation
for "no sig" seems to say we don't need an explicitly anonymous name.
But maybe such a name would be more generally useful, which would
make it a wash.  One obvious candidate for a null name:

    sub () is foo {...}

is of course not possible.  I suppose we could nudge things in a
direction that

    sub & is foo {...}

would work, since that'd be much like

    state $ = do { "I am a fake START block" }

But if we allow "sub &foo" then people will wonder what "sub @foo" means...

Larry

Reply via email to