Me writes:
: [modified repost due to warnock's dilemma]
: 
: Would something like these DWIM?
: 
:     # match pat1 _ pat2 and capture pat2 match:
:     / pat1 { ($foo) = / pat2 / } /

Yes, though I think we'll see people doing it more like this:

     / pat1 ( pat2 ) { $foo = $-1 } /

We might allow something like

     / pat1 $foo=( pat2 ) /

as a shorthand for that.  But in the general case, the closure can
put the value anywhere, and this will be particularly important for
building parse trees.

:     # match pat1 _ 'foo bar':
:     / pat1 { 'foo bar' } /

Probably not.  I can think of several other good uses for return values
from inner closures, such as building a parse tree.  But at the moment
I'm thinking that the return value will be ignored.  If so, {'foo bar'}
might be the way to inline comments in place of (?#foo bar).

:     # match pat2 if not pat1
:     / { ! /pat1/ } pat2 } /

Same issue.  You can always write / { /pat1/ or fail } pat2 /.  I don't
think the return of the closure will be interpreted as a boolean.
Closures will be used for side effects, and I'd hate to see a lot of
closures ending in a cryptic C<0;>.  It's better to make the assertions
explicit.  Could even have a unary "fail unless" operator:

     / { assert /pat1/ } pat2 } /

There might be a better word than assert.

:     # match pat2 if pat1 behind
:     / { .lookbehind /pat1/ } pat2 } /

Sure, presuming .lookbehind knows how to fail.  But <after: pat1> is
much more readable, I think.

Larry

Reply via email to