Luke Palmer wrote:

> I know you heavyweights are working out how to specify the return value
> from a rule or a capture. 

Larry says if the hypothetical variable $0 is assigned to, that assigned
value becomes the (only) return value of the rule. It's an elegant solution
to the problem.


> > Now, could you just do
> >
> >     rule leftop ($leftop, $op) {
> >           <$leftop> [$op <$leftop>]*
> >     }
> >
> >     rule leftop ($leftop, $op, $rightop) {
> >           <$leftop> [$op <$rightop>]*
> >     }
> 
> I should hope that rules can take multiple arguments.

They will. Though I'd be inclined to write C<leftop> like this:

    rule leftop ($leftop, $op, $rightop //= $leftop) {
        $0 := <$leftop>                                           # build 1st node
        [ 
            <$op>                                                 # operator
            <$rightop>                                            # right operand
            { let $0 := {left=>$0, op=>$op, right=>$rightop} }    # build next node
        ]*                                                        # repeat
    }

This elegantly constructs and returns a tree structure which encodes the associativity 
of the left operator as well as its operands. 

Writing C<rightop> is left as an exercise for the reader
(sample solution encrypted at the end of this message ;-)


> Here's something that made me wonder, though: the <$leftop> there is meant to 
> call a rule. But, that syntax -- <$whatever> -- is how you embed a regex in
> another  regex.  So how do we know that $leftop is not a regex wanting to match
> "atom"?  How do we force it to be a rule call? Is it like <$leftop:>?

A rule *is* a regex. There is no distinction. The only issue is whether you
happen to be passing arguments into the sub-rule/sub-regex.



> Can you do this?
> 
>         rule leftop ($leftop, $op) {
>                 @rands := [ (<$leftop:>) [ <$op> (<$leftop:>) ] ] {
>                         return \@rands;
>                 }
>         }

No. You do this:

    rule leftop ($leftop, $op) {
        $0 := [ (<$leftop>) [<$op> (<$leftop>)]* ]
    }


> Could you do the same for captures?
> 
>         / ( @foo := [ (<atom> and) ] { return \@foo } )  {
>                 $1[1]           # Second atom
>         } /

Err, no. I'm sure there's a way to do whatever you're trying to do.
Could you explain what that is?


> I still thing P6 regexen are gorgeous :)

Likewise :-)

Damian

-----cut----------cut----------cut----------cut----------cut----------cut-----

C<rightop> solution (rot13'd):

    ehyr evtugbc ($yrsgbc, $bc, $evtugbc //= $yrsgbc) { 
        [ <$yrsgbc> <$bc> ]* 
        $0:=<$evtugbc> 
        { juvyr @$yrsgbc { yrg $0 := {yrsg=>cbc $yrsgbc, bc=>cbc $bc, evtug=>$0}  } 
    }

Reply via email to