Addendum: the docs are now built, so you can read more at these two links: - https://docs.racket-lang.org/megaparsack/state.html - https://docs.racket-lang.org/megaparsack/reference.html#%28part._parser-parameters%29
On Sun, Jul 4, 2021 at 2:21 AM Alexis King <[email protected]> wrote: > Hi all, > > As some of you may know, I am the maintainer of the Megaparsack > <https://docs.racket-lang.org/megaparsack/index.html> package, a > Parsec-style parser combinator library. Though it’s mostly been in > maintenance mode for some time, the latest release adds a significant new > feature: *user-defined parser state*. This closes the main expressivity > gap Megaparsack has historically had relative to Parsack (though Parsack > continues to be more performant). > > As a quick overview to pique your interest, Megaparsack 1.4 provides a new > abstraction called a *parser parameter*. Parser parameters are similar to > ordinary Racket parameters, but their state is associated with a parsing > context rather than with a thread. Their interface should already look > familiar to Racketeers, so here is an example that uses parser parameters > to implement an indentation-sensitive syntax: > > (define current-indent (make-parser-parameter 0)) > > (define skip-current-indent/p > (do [cols <- (current-indent)] > (repeat/p cols (char/p #\space)))) > > (define markdown-like-list/p > (do (string/p "* ") > [blk <- block/p] > [cols <- (current-indent)] > [blks <- (parameterize/p ([current-indent (+ cols 2)]) > (many/p block/p))] > (pure (cons blk blks)))) > > Modifications to parser parameters are automatically reverted when the > parser backtracks past the point of modification, which allows them to be > used for accumulating information during parsing even if the current parse > branch is tentative. To illustrate, note that this example results in 10 > rather than 15: > > (define current-count (make-parser-parameter 0)) > > (define (increment/p n) > (do [count <- (current-count)] > (current-count (+ count n)))) > > > (parse-string > (do (or/p (try/p (do (string/p "!") (increment/p 5) eof/p)) > (do (string/p "!!") (increment/p 10) eof/p)) > (current-count)) > "!!") > (success 10) > > I generally don’t post about releases to this list, but I happen to know > Megaparsack has at least a few active users, and this is the first major > update in a long while, so I figured I’d give a heads-up. If you’ve counted > the library out in the past for missing this feature, consider giving it > another look. And if you’re interested in learning more, the gory details > are described in the documentation, along with some additional examples (at > the time of this writing, pkg-build hasn’t rebuilt the docs just yet, but > that should be resolved with tomorrow’s daily refresh). > > Happy parsing, > Alexis > -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/CAA8dsafQt%2BCtXPVFKuTYC1ZShC3%3DZgzNBEzfe7_bH67sYCJMCg%40mail.gmail.com.

