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+) ]/ ;

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.

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/

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.  To put the :w
inside the rule (e.g., in a variable or subrule), one would
have to write it as

    rx /[:w::foo bar]/
    rx /:w<null>foo bar/

Now then, I don't have a problem at all with this outcome -- 
but I wanted to let p6l verify my interpretation of things and
make sure it's okay for me to adjust S05/A05 accordingly.

Pm

Reply via email to