On 5/12/05, Patrick R. Michaud <[EMAIL PROTECTED]> wrote:
> I have a couple of questions regarding C< :: > in perl 6 rules.
> First, a question of verification -- in
> 
>     $rule = rx :w / plane :: (\d+) | train :: (\w+) | auto :: (\S+) / ;
> 
>     "travel by plane jet train tgv today" ~~ $rule
> 
> I think the match should fail outright, as opposed to matching "train tgv".
> In other words, it acts as though one had written
> 
>     $rule = rx :w / plane ::: (\d+) | train ::: (\w+) | auto ::: (\S+) / ;
> 
> and not
> 
>     $rule = rx :w /[ plane :: (\d+) | train :: (\w+) | auto :: (\S+) ]/ ;

Those both do the same thing (which is the same as your example). 
When you fail over the :: after plane, it skips out of the alternation
looking for something to backtrack before it.  Since there is nothing,
the rule fails.

> Does this sound right?
> 
> Next on my list, S05 says "It is illegal to use :: outside of
> an alternation", but A05 has
> 
>     /[:w::foo bar]/
> 
> which leads me to believe that :: isn't illegal here even though there's
> no alternation.  I'd like to strike that sentence from S05

Yeah, I think using :: to break out of the innermost bracketing group
is helpful even without an alternation present.

> Also, A05 proposes incorrect alternatives to the above
> 
>     /[:w[]foo bar]/    # null pattern illegal, use <null>
>     /[:w()foo bar]/    # null capture illegal, and probably undesirable
>     /[:w\bfoo bar]/    # not exactly the same as above
> 
> I'd like to remove those from A05, or at least put an "Update:"
> note there that doesn't lead people astray.  One option not
> mentioned in A05 that we can add there is
> 
>     /[:w<?null>foo bar]/
> 
> which is admittedly ugly.
> 
> So, now then, on to the item that got me here in the first place.
> The upshot of all of the above is that
> 
>     rx :w /foo bar/
> 
> is not equivalent to
> 
>     rx /:w::foo bar/

Yeah, but it is.  So no problem.  :-)

> which may surprise a few people.  The :: at the beginning of
> the pattern effectively anchors the match to the beginning of
> the string or the current position -- i.e., it eliminates the
> implicit C< .*? > at the start of the match.

Ohhh, ohh.  There isn't an implicit .*? at the beginning of the match.
 It's more like there's an implicit .*? followed by a rule call to the
match.  Think of it as that we're trying to match the pattern at any
position rather than there being an implicit .*?.

Luke

Reply via email to