On Tue, 27 Dec 2016 11:02:17 -0800, c...@zoffix.com wrote:
> In this code, I would've expected the second multi to be used, since
> I'm not providing
> any named args. I'm fuzzy on whether named params affect multi
> dispatch, but even if they
> wouldn't the multi without any named params is later in the source:
> 
> $ cat test.p6
> multi foo($, :$) { say "there"; }
> multi foo($    ) { say "here";  }
> foo 42;
> 
> $ perl6 test.p6
> there
> 
> A bit of a discussion here: https://irclog.perlgeek.de/perl6/2016-12-
> 27#i_13807727
> 
> -------------------------------------------------------------------------------------
> I also had this to include in the ticket, though I now see it's likely
> unrelated,
> and the throwage happens when the optimizer simply tries to work out
> which candidate
> to call during optimization stage. And the case where throwage is
> avoided is simply
> because the optimizer doesn't go far enough to actually call the
> multi. Including it anyway...7
> 
> 
> If we make the multi that wasn't called above call itself with args
> matching no candidate:
> 
> $ cat test.p6
> multi foo($, :$) { say "there"; }
> multi foo($    ) { foo $, $;    }
> foo 42;
> 
> $ perl6 test.p6
> ===SORRY!=== Error while compiling test.p6
> Calling foo(Mu, Mu) will never work with any of these multi
> signatures:
>     ($, $)
>    ($)
> at test.p6:2
> ------> multi foo($    ) { ⏏foo $, $;    }
> 
> Yet it still works like in the first case, if we turn off the
> optimizer:
> 
> $ cat test.p6
> multi foo($, :$) { say "there"; }
> multi foo($x   ) { foo $x, $;   }
> foo 42;
> 
> $ perl6 test.p6
> there


Not a bug. See explanation by jnthn++: 
https://irclog.perlgeek.de/perl6/2017-02-09#i_14074677

Reply via email to