On Thu, Mar 11, 2021 at 8:53 PM William Michels <w...@caa.columbia.edu> 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