3 ms·
And this is why we have the syntax sugar.
by Twisol 8y ago
And this is why we have the syntax sugar.
- slavik81 8y agoThat introduces problems too. If you try to use sugar like '+' with an implementation that doesn't support it, you don't get any sort of error. Instead you get a different expression. Unfortunately, there's an inherent tradeoff between encoding efficiency and error detection. Notice that with the VerbalExpressions it would be trivial to return a useful error message if the 'at_least_one' pattern did not exist.
- b2gills 8y agoPerl 6 regexes attempt improve upon this situation by making regexes more like a regular programming language. That is it errs on the side of error detection rather than encoding efficiency. (It also adds features that would be difficult to add to Perl 5/PCRE regex design) For a start if it didn't support using `+`, then any attempt to use it would generate a compiler error because it is not alphanumeric. (regex is code in Perl 6) All non-alphanumeric characters are presumed to be metasyntactic, and so must be escaped in some way to match literally. Arguably best way is to quote it like a string literal. (Uses the same domain specific sub-language that the main language uses for string literals) / "+" + / # at least one + character It really is a significant redesign. /A{2,4}/ # Perl 5/PCRE /A ** 2..4/ # Perl 6 /A (?:BA){1,3}/x /A [BA] ** 1..3/ # Perl 6: direct translation /A ** 2..4 % B/ # Perl 6: 2 to 4 A's separated by B /A (?:BA){1,3} B?/x /A ** 2..4 %% B/ # Perl 6: %% allows trailing separator /\" [^"]* \"/x # Perl 5/PCRE /\" <-["]>* \"/ # Perl 6: direct translation /「"」 ~ 「"」 <-["]>*/ # Perl 6: between two ", match anything else # (can be used to generate better error messages) --- # Perl 5 my $foo = qr/foo/; 'abfoo' =~ /ab $foo/x; # Perl 6 my $foo = /foo/; 'abfoo' ~~ /ab <$foo>/; # or my token foo {foo} # treat it as a lexical subroutine 'abfoo' ~~ /ab <&foo>/; --- # Perl 5 my $foo = 'foo'; 'abfoo' =~ /ab \Q $foo \E/x; # treat as string not regex # Perl 6 my $foo = 'foo'; 'abfoo' ~~ /ab $foo/; # that is the default in Perl 6