Autrijus Tang wrote:

Hmm, Warnocked?  I'll assume this is sane, until told otherwise, then. :)

Darn. I was hoping that Larry would field this one. In his absence, I'll take a swing at it. The usual all(any(@Larry), none($Larry)) caveats apply.

So I'm finally starting to implement multi-level invocants in MMDs.
I'd like to sanity check some cases first, though.

Are these two assumed to be identical?

    multi sub foo ($x, $y)
    multi sub foo ($x, $y : )

Yes. The rule is that every parameter of a multi, up to the last colon (if any), is an invocant.

But these two are _not_ identical?

    multi sub foo ($x : $y : $z)
    multi sub foo ($x : $y : $z : )

Correct. Both dispatch first on their $x parameter. Then (because the types of the two $x parameters are identical (i.e. Any)), both dispatch on their $y parameters. Again, both parameter types are identical, so the third-level invocants are used as a second-order tie-breaker. The first multisub doesn't *have* a third-level invocant, so it loses immediately. The type of the second multisub's third-level invocant is Any, so it matches at zero cost and is invoked.

Are multiple colons usable in invocation?


S12 says all the following cases "come out to the same thing":

    $handle.close       # 1
    close($handle)      # 2
    close $handle:      # 3
    close $handle       # 4

Does it mean that during invocation, when there is no colons and
no dots, an implicit colon is added at the end, making all arguments
same-level invocants and subject to MMD?

This is only true if there is exactly one argument and there's a multi of the appropriate name in scope at the time.

That is, these are identical:

    foo($a, $b)
    foo($a, $b : )

No, the second is an error.

But these two are _not_:

    foo($a : $b : $c)
    foo($a : $b : $c : )

Well, they're both errors, so whether they're identical becomes a philosophical problem. ;-)


Reply via email to