Technically, the Racket version is using a separate lexer and parser library, it's just that Racket erases the line between what is a library and what is a language when it comes to lexers and parsers. One could either say this is a Racket program that uses the Brag library, or a Brag program (though the latter is preferred in the Racket ecosystem).
(On the other hand, the raku version also implements operator precedence properly, with infix operators having lower precedence than logical negation.)
Hi, author here. I'm new to Racket and obviously no expert. I realized this problem, but I wasn't sure about the best way to go about fixing it, do you have any suggestions?
I would do something similar to the raku version and have an extra bit in the grammar. Don't know racket or brag, but maybe something like http://ix.io/2AXE
Prolog implements Definite Clause Grammars[0] which can express context-sensitive grammars.
In Prolog there is a simple DSL to express DCGs, but in fact DCG just uses Prolog runtime features. I don't believe there is aanother general purpose language with such complex parsing just built-in the runtime.
It was a logical extension of regexes, which were a very important part of perl (raku was originally perl 6). It also integrates very well with the rest of the language—even more so than does regex with perl.
However, though I think raku's reimagination of regexes is probably the best one—and the one that feels the least bound to legacy—there are other developments in that area. For instance, oil's egg expressions - http://www.oilshell.org/preview/doc/eggex.html
There’s a fun old-school spelling for the logical AND and OR operators in languages that officially spell them ∧ or ∨ but need to be typed in ASCII: /\ and \/
I am having trouble finding real world examples right now, but it happens in languages like ALGOL and CPL (tho they predate ASCII)
TLA+ is an example. What I really like about this notation is you can use alignment to indicate precedence:
\/ /\ A
/\ B
\/ /\ C
/\ D
Which represents (A & B) || (C & D). It helps quite a bit for parsing large formulas in your head. In TLA+ the individual expressions are usually much more complicated than a single variable.
Aha, occam is another example, but it uses AND and OR for logical expressions but \/ or /\ for bitwise, plus the exciting >< for xor! http://transputer.net/obooks/obooks.asp
I am never a fan of posts about "do x in y language in z lines" because inevitably there is a library involved. These posts should really involve a pure implementation in the language.
(Though, granted, the latter does need to separate lexer and parser.)
1. http://ix.io/2ASA