sub infix:<foo> ($a, $b = ($a foo 2 * 3 - $a)) is tighter(&infix:<*>) { $a == 0 ?? 1 foo 2 * 3 !! $a + $b }
say 1 foo (2 * 3); # 7 say (1 foo 2) * 3; # 9 say 1 foo 2 * 3; # 9 say infix:<foo>(1); # Niecza: 7 say 0 foo 0; # Niecza: 9 The way that Niecza does this is to install the operator with default precedence before the signature (which means the default is parsed with * binding tighter than foo) and then twiddling the precedence before the body (which means the $a == 0 case is parsed with foo binding tighter than *) Is this right? Is it necessary (i.e. does the spec mandate the operator existing while parsing the signature and/or body)? I'm considering doing the work to get Rakudo to do the tighter/looser traits and can't find the bits of the spec which might apply to these (admittedly bizarre) edge cases. I suppose for completeness I should have added in some more traits which used foo in an expression - or is that definitely not ok?