On Wednesday, 17 June 2020 at 11:50:27 UTC, Per Nordlöw wrote:
Should a range-compliant aggregate type realizing a parser be
encoded as a struct or class? In dmd `Lexer` and `Parser` are
both classes.
In general how should I reason about whether an aggregate type
should be encoded as a struct or class?
IMO it doesn't need to be. However, it's worth saying that range
semantics aren't a great fit for parsers - at least that's been
my experience. Parsers need to be able to "synchronize" to
recover from syntax errors, which does not fit into the range API
very well. You can probably fit it in somewhere in popFront or
front or empty, as your implementation permits, but I find it's
just easier to forego the range interface and implement whatever
primitives you need; *then* you can add a range interface over
top that models the output of the parser as a range of
expressions, or whatever you want.