In particular, while input delimiters are usually used for the default
output delimiters, setting empty input delimiters to specify the
line-based or the stream based input format should not cause the output
delimiters to be empty.
I still use "UserExpr" instead of "Expr", but when there is an extra
qualifier, I stick to the short form. Before, the long and short forms
were used inconsistently.
We now keep track of the different types which the user expression could
have at the beginning, and we convert it to a processed and then a
canonical expression via a series of type-safe transformations.
Instead of hardcoding the output of the transformed user expression to
be (), let's allow it to be any type with an instance of Rows. This will
allow us to hardcode the output of the untransformed user expression
instead.
The new runtime, based on HawkRuntime, was implemented from scratch,
thereby re-introducing many bugs which had been fixed long ago. Better
to refactor incrementally next time!
Having the source for the runtime and executable at the same place was
causing issues during the test. By giving the path to the executable
source, ghci (called by doctest) was also finding the source to the
runtime, which caused HawkRuntime values to be interpreted instead of
compiled. This in turn conflicted with hint, who is only using compiled
values except inside the user expression. That caused ghci to segfault,
and doctest to report an unexpectedly-closed handle.