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