[HN Gopher] Visual programming with Elixir: Learning to write bi...
___________________________________________________________________
Visual programming with Elixir: Learning to write binary parsers
(2019)
Author : Dowwie
Score : 80 points
Date : 2023-03-31 10:08 UTC (1 days ago)
(HTM) web link (hansonkd.medium.com)
(TXT) w3m dump (hansonkd.medium.com)
| codesnik wrote:
| some errors there. head = 0x00 piece =
| <<0x01, 0x01, 0x01, 0x01, 0x01>> << head, #
| When a variable is already referenced it must be equal for the
| pattern to match piece, # Match a string
| rest :: binary >> # You can mix matching variables and assigning
| new variables.
|
| it should have ^head, and ^piece (the term is "pinning"). Unlike
| in erlang, elixir will happily "reassign" variables to the new
| content on whatever is on a right side of the match.
| codesnik wrote:
| I sometimes ponder, how much effort it would take to make a
| similar matching interface not for binaries but for regexps
| and/or something grammar-like. After structured matching of
| binaries regexps in elixir just feel awkward.
|
| It wouldn't work well with other matching constructs, though, if
| matching is baked into beamvm itself as a core instruction for
| speed or something. Guess I have something to investigate this
| evening.
| bmitc wrote:
| It's not Elixir, but you might be interested in F#'s active
| patterns, particularly the parameterized active patterns:
| https://learn.microsoft.com/en-us/dotnet/fsharp/language-ref...
|
| F#'s active patterns allow you to extend the built-in pattern
| matching to other things, and in this case, you can have
| patterns that return regular expression matches.
| pmarreck wrote:
| You could probably write a regex parser in pure Elixir
| quikoa wrote:
| https://archive.is/2rwPv
| Nezteb wrote:
| You can also replace `medium.com` with `scribe.rip` to get a
| much friendlier frontend: https://hansonkd.scribe.rip/building-
| beautiful-binary-parser...
| quikoa wrote:
| Interesting, I didn't know about that one, thanks!
| gen_greyface wrote:
| i have a bookmarklet for this. love that it formats the
| github embeds quite nicely too. javascript:
| (()=>window.location.href="https://scribe.rip"+location.pat
| hname)()
| dugmartin wrote:
| If you are interested in learning about text (not binary) parsing
| in Elixir check out the nimbleparsec library:
|
| https://hexdocs.pm/nimble_parsec/NimbleParsec.html
|
| I was able to write a very succinct parser for woodworking (using
| imperial fractions) in around 38 lines of commented code. It
| parses strings like 0.25 or 2 or 1/4 or 1/4" or 1' 2 3/4" and
| pops out an integer or float in inches.
|
| I had never used a parser combinator library before but I have
| written many recursive descent parsers over the years. I was a
| little surprised when I added the `debug: true` option and saw
| the shear amount of code it generated. That probably could be
| reduced by refactoring my combinators.
| geekodour wrote:
| i am interested in knowing what is woodworking here
___________________________________________________________________
(page generated 2023-04-01 23:00 UTC)