Parsing – REBOL Users Guide
rebol.com
rebol.com
A cool thing about Rebol's (and Red's) PEGs are that they can easily parse and process the diverse datatypes of its parent source.
REBOL Parser in 10 Lines http://www.rebol.net/cookbook/recipes/0042.html
And:
http://blog.hostilefork.com/why-rebol-red-parse-cool/ "But even more impressively, it can work on the symbolic structure of code itself. While Rebol and Red are both like Lisp in being homoiconic, when you see something like PARSE applied on code itself... you know you're looking at something very cool."
Of course I wrote a number of simple utilities, but I also did several large and comprehensive applications with complete user interfaces. I could staple together a fully styled interface with custom widgets in an afternoon compared with (at best) several days for equivalent functionality with other toolkits. Most of my large programs communicated with our production management database using XMLRPC.
The GUIs including things like a full graphical Avid-style editorial timeline, a multi-panel interface for managing data on the review playback system, one that mimicked the playback system interface (complete with reflections and drop shadows) to make the operator feel at home... Even one with a wise cracking virtual assistant that guided the operator through the task. All of these were operational and bug free in a fraction of the time that would have been consumed by Python/wx.
Just as important as simple and flexible GUIs were the built in parsing, binary and image processing. I could make a shot slates (images with text noting the shot number and production) quickly and easily because anything you could show in the GUI could be exported as an image. I did complete stereo audio processing for Editorial inside REBOL with no external libraries -- it was simple and fast. When I later had to replicate this utility in Python I finally threw up my hands and shelled out to sox.
In general, these tools were rock solid, fast, easy and attractive to use.
So it's a great language, and Red seems like it will be a worthy successor. The learning curve to use it effectively is a bit steep because it has many differences from ALGOL derived languages. But once you figure it out, you'll never want to give it up!
NB. Above isn't parse specific.
My teams are business users-- web-savvy marketers, designers and data analysts -- i.e., a semi-technical group. Some can write javascript and/or SQL, but they aren't programmers. We need very simple, short, readable scripts. Most languages require regular expressions, which are not a good fit for my teams unless the task is fairly basic. Rebol's Parse DSL is probably the best regular expression replacement I've found in my career. We basically have no need for RE's ever.
Rebol (and Red) have plenty of other uses -- and we've built some nice desktop GUI apps. But our main needs are around data-munging/wrangling -- scanning tens of thousands of files and/or webAPIs and parsing/extracting/transforming that data to make our many haystacks needle-free. For us, Rebol/Red have the simplest tools that work well for this job.
I imagine in the future, with greater emphasis on knowledge worker roles (such as data analysts), we may see the emergence of even simpler languages than available today-- My $.02 -- I just don't think R/Python/Ruby/Perl are quite simple enough for semi-technical staff and non-programmers.
With regards to this I do like Hostilefork's companion blog post regarding macros - http://blog.hostilefork.com/rebol-vs-lisp-macros/ (HN comments - https://news.ycombinator.com/item?id=11587952)
[1] http://www.github.com/red/red
[2] http://www.red-lang.org/2013/11/041-introducing-parse.html
Fun example: https://github.com/perl6/perl6-examples/blob/master/categori...
* Regexp::Grammars - https://metacpan.org/pod/Regexp::Grammars
* Parse::RecDescent - https://metacpan.org/pod/Parse::RecDescent
NB. I think thats also same for Parsec (built out of Haskell's parser combinators)
BTW - Damian created both of them, Regexp::Grammars was his replacement for his Parse::RecDescent.
Here's a (very) simple example I did in Perl5 - https://news.ycombinator.com/item?id=6895126
And here's a (nicer!) port to Rebol I also did - https://www.reddit.com/r/programming/comments/1smpa1/why_reb...
digits: charset "1234567890"
char: charset [#"a" - #"z" "+/-*"] ;; chars allowed in a symbol
not-quot: complement charset {"}
esc-string: [{\"} | not-quot]
bool: ["#t" | "#f"]
float: [opt "+-" any digits "." some digits]
number: [opt "+-" some digits]
symbol: [some char]
quot: [#"'" [sexp | atom]]
string: [{"} any esc-string {"}]
statement: [sexp | atom | space | newline]
sexp: ["(" any statement ")"]
atom: [bool | float | number | quot | symbol | string]
lisp-rule: [some statement]
NB. I wrote this "off the cuff" so I don't expect it to be flawless! Also there are no capture rules provided in my example (unlike perl6 grammars which provides this automatically).Anyway neither example fully covers the Common Lisp spec for a number atom (for eg. scientific notation or rationals).
(print (multiply (add 1 2) 3))
... will print an answer of 9