On Thu, Mar 11, 2021 at 8:53 PM William Michels <[email protected]> wrote:
>
> I think there's something going on with the examples below, as I'm
> seeing different results when comparing a basic "rule" match vs either
> unnamed or named "rule" captures.
All your examples are correct according to my current understanding.
The key issue is that the patterns you're sub-capturing exclude the
significant space whereas the non-captured ones don't.
I'll respond only to your TL;DR in this comment. Perhaps give yourself
time to have a couple repl sessions, then time away from the computer
doing something completely different, before responding to go through
any residual confusion, or if it turns out I've gotten something wrong.
----
> say $/ if 'ab' ~~ rule {.? .?}
「a」
The first `.? ` (including the token boundary implied by the space)
matches against the `a`. It fails.
The second `.?` then matches the `a`.
The `~~` succeeds and reports the match of `a`.
> say $/ if 'ab' ~~ rule {(.?) (.?)}
The first `.?` (excluding the token boundary) matches against the `a`
and succeeds.
`:ratchet` is in effect so the engine will not reconsider this decision.
The space in the pattern then fails to match a token boundary.
Due to `:ratchet` being in effect, the entire rule fails.
Because you're using `~~`, the engine then moves forward one character
in the input, pretending the input begins with `b`.
The first `.?` matches against the `b` and succeeds.
The space in the pattern successfully matches a token boundary (end of
input).
Thus the rule succeeds, and so the `~~` succeeds, and reports a match of `b`.
--
love, raiph