On Thu, May 21, 2009 at 02:56:23AM -0700, Carl Mäsak wrote: : # New Ticket Created by "Carl Mäsak" : # Please include the string: [perl #65878] : # in the subject line of all future correspondence about this issue. : # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=65878 > : : : <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? : <masak> dakkar: "don't do that" only applies after you've found out : that what happens is really not what you want. :) : <dakkar> masak: fair enough. the general question is: what should P6 : do when meta-generated operators clash with user-defined subs? I : *think* rakudo is doing a sensible thing, btw : <masak> dakkar: me too. : <jnthn> dakkar: Your definition just happens later and wins atm, but : it's a little more ty accident than it perhaps should be. : <masak> depends on whether the auto-defined RR is considered a real : sub. then it should perhaps complain. : <jnthn> Well, it's a real sub. Question is if we make it a multi... : <jnthn> But in that case we woulda got a failure here. : <jnthn> I'm not sure. The spec may have answers. : <jnthn> But I don't remember seeing any. : <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 '=' : <jnthn> dakkar: Ah, OK, so should probably be an error or some thing for those. : * masak submits rakuodbug
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. We used to try to form tokens out of all possible forms of meta, but that resulted in an explosion, even with restrictions on meta recursion. So we lifted the restriction and now parse metas separately, albeit still with the requirement of no whitespace between meta and base op. Anyway, if there is a tie between a meta and a normal, it tries the meta first and then backtracks to the normal if the meta doesn't find a base op. That's how Xop wins against X. Larry