Jonathan Scott Duff wrote:
> > > rule val {
> > > [ # quoted
> > > $b := <['"]>
> > > ( [ \\. | . ]*? )
> > > $b
> > > ] | # or not
> > > (\H+)
> > > }
> >
> > Not quite. Assigning to $b is a capture.
>
> I'm confused. The examples in A5 all show $var := (pattern). So are you
> saying that parens or no, binding with := affects a capture into
> $1,$2,etc.? Or that it affects a capture that alters the return value
> of the rule, just not $1,$2,etc.?
The latter.
> So ... should this work?
>
> rule quote { <["']> }
> rule quotedword { <quote> (<alpha>+) $quote }
> $justtheword = /<quotedword>/;
My understanding is that it won't just return the word. If you invoke a named rule,
its return value is captured in a hypothetical variable of the same name (but *not*
into a numbered hypovar -- only parens do that). The named hypovar lives inside the
object that is ultimately returned to the next level up.
So C<rule quote> returns (what appears to be) a simple string to C<rule quotedword>,
but -- because of the captures it does -- C<rule quotedword> returns an object with
embedded C<$quote> and C<$alpha> hypovars.
> And if the above works, why can't "$var:=atom" be a short hand for a
> lexical "rule var { atom }" that only applies for the current ... um ...
> rule/<insert more appropriate word>? And thus the capture would be out
> of band WRT $1, $2, etc. or the rule's return value.
As explained above, named captures *are* out-of-band wrt $1, $2, etc.
Just not wrt to the return value.
As I mentioned in a previous post, the issue is how to control what a given
(sub-)rule returns (i.e. all its explicit and captures, or just a specific
result). I think the correct answer is to control that explicitly, via a
<return...> assertion or a $RETURN:= capture.
Damian