This is going to be the main issue for a big, long-running problem: Error messages are awful right now. They need to be vastly improved and, in some cases, rewritten entirely.
Parse errors are actually quite good, because they come from parsec. No major action needs to be taken there.
Errors should show where they come from, at minimum a module/function name and ideally a line number.
Some errors are being overused, such as NoSuchFunction whenever a name (not necessarily a function) doesn't exist. We need to redo that error and separate it out nicely.
Lots of errors need more arguments, as they don't convey enough information. For instance, NotAFunction and NotAModule give zero information aside from those two words.
Generally, errors need to be prettied up in the form they show to the user, even when they technically do convey the right info.
InternalError shouldn't nest. If an internal error is going to be wrapped in another internal error, don't wrap it.
We may get rid of InternalError entirely and just use Haskell's IO error functionality, as it's intended for "impossible" situations which indicate a bug and will likely give more relevant stack traces than my errors, which will be focusing on user code, not compiler line numbers.
This is going to be the main issue for a big, long-running problem: Error messages are awful right now. They need to be vastly improved and, in some cases, rewritten entirely.
NoSuchFunction
whenever a name (not necessarily a function) doesn't exist. We need to redo that error and separate it out nicely.NotAFunction
andNotAModule
give zero information aside from those two words.InternalError
shouldn't nest. If an internal error is going to be wrapped in another internal error, don't wrap it.InternalError
entirely and just use Haskell's IOerror
functionality, as it's intended for "impossible" situations which indicate a bug and will likely give more relevant stack traces than my errors, which will be focusing on user code, not compiler line numbers.