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-y␤x_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-y␤y-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

Reply via email to