The "Interpolation" section of the raku docs use strings as the elements of building up a larger regex from smaller pieces, but the example that looks fruitful isn't working in my raku. This is taken from https://docs.raku.org/language/regexes#Regex_interpolation
> my $string = 'Is this a regex or a string: 123\w+False$pattern1 ?'; Is this a regex or a string: 123\w+False$pattern1 ? > my $regex = /\w+/; /\w+/ > say $string.match: / $regex /; Regex object coerced to string (please use .gist or .raku to do that) ... and more error lines, and no result when the docs show matching '123': 「」 $ raku -v Welcome to 𝐑𝐚𝐤𝐮𝐝𝐨™ v2020.10. Implementing the 𝐑𝐚𝐤𝐮™ programming language v6.d. Built on MoarVM version 2020.10. -y On Wed, Mar 17, 2021 at 3:17 PM William Michels via perl6-users < perl6-us...@perl.org> wrote: > Dear Brad, > > 1. The list you posted is fantastic ("If the first character inside is > anything other than an alpha it doesn't capture"). It should be added to > the Raku Docs ASAP. > > 2. There are some shortcuts that don't seem to follow a set pattern. For > example a named capture can be accessed using $<myname> instead of > $/<myname> ; the "/' can be elided. Do you have a method you can share for > remembering these sorts of shortcuts? Or are they disfavored? > > > say ~$<myname> if 'abc' ~~ / $<myname> = [ \w+ ] /; > abc > > > [ Above from the example at https://docs.raku.org/syntax/Named%20captures > ]. > > 3. Finally, I've never seen in the Perl6/Raku literature the motto you > cite: "One of the mottos of Raku, is that it is ok to confuse a new > programmer, it is not ok to confuse an expert." Do you have a citation? > > [ The motto I prefer is from Larry Wall: "...easy things should stay easy, > hard things should get easier, and impossible things should get hard... ." > Citation: https://www.perl.com/pub/2000/10/23/soto2000.html/ ]. > > Best Regards, > > Bill. > > > > On Sat, Mar 13, 2021 at 4:47 PM Brad Gilbert <b2gi...@gmail.com> wrote: > >> It makes <…> more consistent precisely because <$pattern> doesn't capture. >> >> If the first character inside is anything other than an alpha it doesn't >> capture. >> Which is a very simple description of when it captures. >> >> <?before …> doesn't capture because of the 「?」 >> <!before …> doesn't capture because of the 「!」 >> <.ws> doesn't capture because of the 「.」 >> <&ws> doesn't capture because of the 「&」 >> <$pattern> doesn't capture because of the 「$」 >> <$0> doesn't capture because of the 「$」 >> <@a> doesn't capture because of the 「@」 >> <[…]> doesn't capture because of the 「[」 >> <-[…]> doesn't capture because of the 「-] >> <:Ll> doesn't capture because of the 「:」 >> >> For most of those, you don't actually want it to capture. >> With 「.」 the whole point is that it doesn't capture. >> >> <digit> does capture because it starts with an alpha >> <pattern=$pattern> does capture because it starts with an alpha >> >> $0 = <$pattern> doesn't capture to $<pattern>, but does capture to $0 >> $<pattern> = <$pattern> captures because of $<pattern> = >> >> It would be a mistake to just make <$pattern> capture. >> Consistency is perhaps Raku's most important feature. >> >> One of the mottos of Raku, is that it is ok to confuse a new programmer, >> it is not ok to confuse an expert. >> An expert in Raku understands the deep fundamental ways that Raku is >> consistent. >> So breaking consistency should be very carefully considered. >> >> In this case, there is very little benefit. >> Even worse, you then have to come up with some new syntax to prevent it >> from capturing when you don't want it to. >> That new syntax wouldn't be as guessible as it currently is. Which again >> would confuse experts. >> >> If anyone seriously suggests such a change, I will vehemently fight to >> prevent it from happening. >> >> I would be more likely to accept <=$pattern> being added as a synonym to >> <pattern=$pattern>. >> >> On Sat, Mar 13, 2021 at 3:30 PM Joseph Brenner <doom...@gmail.com> wrote: >> >>> Thanks much for your answer on this. I think this is the sort of >>> trick I was looking for: >>> >>> Brad Gilbert<b2gi...@gmail.com> wrote: >>> >>> > You can put it back in as a named >>> >>> > > $input ~~ / <pattern=$pattern> >>> > 「9 million」 >>> > pattern => 「9 million」 >>> > 0 => 「9」 >>> > 1 => 「million」 >>> >>> That's good enough, I guess, though you need to know about the >>> issue... is there some reason it shouldn't happen automatically, >>> using the variable name to label the captures? >>> >>> I don't think this particular gotcha is all that well >>> documented, though I guess there's a reference to this being a >>> "known trap" in the documentation under "Regex interpolation"-- >>> but that's the sort of remark that makes sense only after you know >>> what its talking about. >>> >>> I have to say, my first reaction was something like "if they >>> couldn't get this working right, why did they put it in?" >>> >>> >>> On 3/11/21, Brad Gilbert <b2gi...@gmail.com> wrote: >>> > If you interpolate a regex, it is a sub regex. >>> > >>> > If you have something like a sigil, then the match data structure gets >>> > thrown away. >>> > >>> > You can put it back in as a named >>> > >>> > > $input ~~ / <pattern=$pattern> >>> > 「9 million」 >>> > pattern => 「9 million」 >>> > 0 => 「9」 >>> > 1 => 「million」 >>> > >>> > Or as a numbered: >>> > >>> > > $input ~~ / $0 = <$pattern> >>> > 「9 million」 >>> > 0 => 「9 million」 >>> > 0 => 「9」 >>> > 1 => 「million」 >>> > >>> > Or put it in as a lexical regex >>> > >>> > > my regex pattern { (\d+) \s+ (\w+) } >>> > > $input ~~ / <pattern> / >>> > 「9 million」 >>> > pattern => 「9 million」 >>> > 0 => 「9」 >>> > 1 => 「million」 >>> > >>> > Or just use it as the whole regex >>> > >>> > > $input ~~ $pattern # variable >>> > 「9 million」 >>> > 0 => 「9」 >>> > 1 => 「million」 >>> > >>> > > $input ~~ &pattern # my regex pattern /…/ >>> > 「9 million」 >>> > 0 => 「9」 >>> > 1 => 「million」 >>> > >>> > On Thu, Mar 11, 2021 at 2:29 AM Joseph Brenner <doom...@gmail.com> >>> wrote: >>> > >>> >> Does this behavior make sense to anyone? When you've got a regex >>> >> with captures in it, the captures don't work if the regex is >>> >> stashed in a variable and then interpolated into a regex. >>> >> >>> >> Do capture groups need to be defined at the top level where the >>> >> regex is used? >>> >> >>> >> { # From a code example in the "Parsing" book by Moritz Lenz, p. 48, >>> >> section 5.2 >>> >> my $input = 'There are 9 million bicycles in beijing.'; >>> >> if $input ~~ / (\d+) \s+ (\w+) / { >>> >> say $0.^name; # Match >>> >> say $0; # 「9」 >>> >> say $1.^name; # Match >>> >> say $1; # 「million」 >>> >> say $/; >>> >> # 「9 million」 >>> >> # 0 => 「9」 >>> >> # 1 => 「million」 >>> >> } >>> >> } >>> >> >>> >> say '---'; >>> >> >>> >> { # Moving the pattern to var which we interpolate into match >>> >> my $input = 'There are 9 million bicycles in beijing.'; >>> >> my $pattern = rx{ (\d+) \s+ (\w+) }; >>> >> if $input ~~ / <$pattern> / { >>> >> say $0.^name; # Nil >>> >> say $0; # Nil >>> >> say $1.^name; # Nil >>> >> say $1; # Nil >>> >> say $/; # 「9 million」 >>> >> } >>> >> } >>> >> >>> >> In the second case, the match clearly works, but it behaves as >>> >> though the capture groups aren't there. >>> >> >>> >> >>> >> raku --version >>> >> >>> >> Welcome to 𝐑𝐚𝐤𝐮𝐝𝐨™ v2020.10. >>> >> Implementing the 𝐑𝐚𝐤𝐮™ programming language v6.d. >>> >> >>> > >>> >>