On Thu, May 21, 2009 at 07:20:57PM +0200, Gianni Ceccarelli wrote: : On 2009-05-21 Larry Wall <la...@wall.org> wrote: : > : <dakkar> rakudo: sub infix:<R>($a,$b) { $a ~ '-' ~ $b }; sub : > : infix:<RR>($a,$b) { $a ~ '_' ~ $b }; say 'x' R 'y'; say 'x' RR 'y'; : > : <p6eval> rakudo e6b463: OUTPUT«x-yx_y» : > : <dakkar> now, apart from "don't do that", what should happen? : > : [snip] : > : <dakkar> jnthn: about the meta-operator collision thing, S03 says : > : that you can't modify with '!' forms that start with '!', and you : > : can't modify with '=' forms that end with '=' : : Ok, let me try to explain what I was aiming at… : : If we have a normal operator, whose spelling is the same as a : meta-modified version of another operator, which one should get : called? The normal (like rakudo does today), or the meta-modified? IN : my example, is the output correct, or should it have been «x-yy-x» ?
The output is correct, though perhaps for the wrong reason. : > I don't see a bug here. First, there's no prohibition on multiple : > similar metas anymore. But with regard to the example above, metas : > are parsed as their own tokens, and the infix:<RR> is longer than : > the meta R, so should take precedence under LTM. : : Ok, so this means that rakudo does the right thing, which looks pretty : sensible to me. I think rakudo is relying on ordered rules rather than longest token matching here. : So normal operators will always take precedence against meta-modified : operators. No, the longest token takes precedence, regardless of whether it's normal or a metaop. But most metops are short, like « or X. The following infix doesn't count as part of the token. RR takes precedence over R above by virtue of being a single token. : Should there be a way to explicitly say "I mean a : meta-operator here"? If I write: : : sub infix:<»ö«>($a,$b) { return "butterfly between $a and $b" } : sub infix:<ö>($a,$b) { return abs($a-$b) } : : how do I make: : : say (1,2,3) »ö« (3,4,5) : : print: : : 2 2 2 You may always put the actual infix into square brackets to disambiguate, so: say (1,2,3) »[ö]« (3,4,5) (I don't know if rakudo supports that yet though.) Likewise, you can distinguish R[R] from RR. Larry