Eirik Berg Hanssen writes: > Luke Palmer <[EMAIL PROTECTED]> writes: > > You shouldn't parse the right hand side yourself. That fixes the > > issue. > > I was not aware of this option. A6/E6 gave me the impression that > C<is parsed> would override the default parsing of the RHS, not > merely augment it. Does the parsed-trait somehow interact with the > signature of the macro, to find out whether to extend or replace?
Hmm. For an ordinary list operator, we have a rule something like this: rule listop() {:w <listop_id> [ <parglist> | <arglist> ] } I can imagine that, in the presence of C<is parsed>, it look more like: rule listop() {:w <listop_id> <{ $listop_id.parsed // /<parglist> | <arglist>/ }> } This isn't a problem, as it's a rule tail-call. Now let's look at how operators might be done. It's possible to store precedence in a linked list of collections of operators, so: sub infix:+ () {...} # Default sub infix:* () is tighter(&infix:+) {...} sub infix:/ () is same(&infix:*) {...} sub infix:** () is tighter(&infix:*) {...} sub infix:== () is looser(&infix:+) {...} Makes the list: /==/ -> /\+/ -> /* | \// -> /\*\*/ Associativity would be stored in the list frames, too. If you're doing bottom up parsing, this is a terrible way to do things for efficiency reasons. But it's quite nice for top down. rule infixop($prec) {<{ given $prec.assoc { when 'left' { # Let's just pretend left recursion is possible /:w <infixop($prec)> <$prec.ops> <infixop($prec.next)> / } when 'right' { /:w <infixop($prec.next)> <$prec.ops> <infixop($prec)> / } when 'non' { /:w <infixop($prec.next)> <$prec.ops> <infixop($prec.next)> / } } } | <infixop($prec.next)> } Among this list also lives the prefixes and postfixes, complicating these rules somewhat. We'll ignore these for now. Now you can see that allowing an C<is parsed> rule on operators to grab the rhs would screw up its precedence, unless the programmer could explicitly call C<< <infixop($prec.next)> >>. That can be done to some extent with your speculatively_equiv property, but still one must take great care to keep from making a mess of the parse tree. > That is, can I write prefix:-macros that do not take the default RHS > parameters, but only the ones generated by C<is parsed>? Quotelike > operators come to mind: > > macro prefix:qtex ($raw) > is parsed( /(<Perl6.delimited_balanced .*?>)/ ) { ... } > > Or would that be accomplished by another keyword, indicating what, > in the absence of C<is parsed>, would be 0-ary? term:qtex, perhaps? Yeah. Or circumfix:, but that doesn't work for custom quoting operators. term: would be pretty nice for custom parsing rules, actually. > I guess that depends upon what kind of consistency you are aiming > for. > > > > Do you I<want> to give me a heart attack? :-/ > > Nope. I will try to restrain myself. > > > This would be fine, I think: > > > > sub eqn ($n) { &String::strncmp.assuming(n => $n) } > > You mean it would be fine for using with the infix:[ macro, right? > But then you could not get the precedence you want. You would be > stuck with whatever precedence infix:[ was given. Yeah, that's true. But note that you can't do that black magic you were speaking of earlier: $a [ (cond ?? &infix:+ : &infix:*) but tighter(&infix:*) ] $b Because we can't choose the precedence of an operator after we parse it... unless we're doing bottom up, which we're not. I do think that the infix [] construct would have to have a fixed precedence. Luke