There's some ambiguity in A/S 6 that I wanted to ask about.

A6 says:

        Ordinary subs never have an invocant. If you want to declare a
        non-method subroutine that behaves as a method, you should
        declare a submethod instead.

But S6 changes that without fully explaining itself:

        Multimethod and multisub invocants are specified at the start of
        the parameter list, with a colon terminating the list of
        invocants

S12 sayeth:

        Ordinarily all the arguments of a multi sub are considered
        invocants
        [...]
        The caller indicates whether to use single dispatch or multiple
        dispatch by the call syntax. The "dot" form and the indirect
        object form default to single dispatch. Subroutine calls with
        multiple arguments and operators with multiple operands default
        to multiple dispatch.

Ok, so here we are. I'm told on #perl6 that you can't have something
like:

        class Num {
                method abs() returns Num { ... }
        }
        multi sub abs(Num $i:) returns Num { ... }

because you're not allowed to define both multi and single-dispatch
methods on a class.

Let's say that that's true. You can certainly still end up in conflict:

        class A {...}
        my A $a = A.new() but role { method x() {...} }
        eval 'multi sub x(A $i:) {...}';

Now, the eval should work because A has no x method, but you do now have
a $a which will conflict on $a.x

According to the above bit from S12, $a.x calls single dispatch first,
so it should call the anonymous role's method x, right?

If I wanted to call the multi, I could aways say: x($a), couldn't I?

-- 
Aaron Sherman <[EMAIL PROTECTED]>
Senior Systems Engineer and Toolsmith
"It's the sound of a satellite saying, 'get me down!'" -Shriekback


Reply via email to