Here's a concrete proposal for error message structe.  I'll leave the
highlevel philosophical discussion to the other threads -- but JFYI,
it does require accepting the problems I mention in the "phrasing"
thread.

The general idea is that the first line of an error message is a
title, and therefore should provide as much helpful information as
possible, in a short form that usually will fit on a single line.
This works well with the previous error message format, but broken
down completely when errors contain a lot of details.  Notable
examples: list of paths in a cyclic require; the list of "other
arguments" in type errors; the "probably" explanation on an empty
() application error; and the suggestion made in the link errors.

So I'm suggesting that the first line is the "error title" which is
kept in a form similar to what it was.  That is:

    [optional short location information]
    offending token:
    short description (fits on one line)

The next line(s) (single or few) add more precise and verbose details
on the error.  Examples of that are the suggestion I mentioned above,
or the more accurate description of an unbound identifier error, or
the `#%app' mention in the () case.

Following that are the "fields", which can stay in a semi-structured
textual format for making them parsable.  This structure should be
specified, but given the above two parts there is no need for being
very specific with various fields etc.

As a concrete example, a contract error could be:

  foo.rkt:10:15: blah: bad input
    Contract violation in the first argument, your code broke the
    contract of blah from `some-library/blah'.
    expected: ...
    given: ...
    argument position: ...
    other arguments: ...
    full path: ...
    contract location: ...
    context: ...

Note how the first line is imprecise, and provides just a summary.
The idea is what I discussed previously -- in many cases this error
will pop up after some revision to the code that you just did, so
that's enough to know what the problem.

The following two lines provide more precise information -- and now
that they're on following lines, that description is no longer
restriced to be short in any way.  This means, for example, that
Ryan's semi-complaint about the non-preciseness of unbound identifier
errors can be addressed.

Next to that there is the list of fields, and since it's all "down
after the main texts", it's becoming practical to add a lot of
relevant information like full paths of the files in question,
even more detailed explanations on what the error is, suggestions for
fixing it, pointers to URLs about those errors, etc etc.

>From a presentation point of view (eg, drracket and xrepl), this
format makes things very easy, since it follows the way you'd want to
present the information.  For example, drracket can do the following
pretty easily (just random suggestions, of course):

  * Show the usual stop-sign line with just the title line (without
    the location)
  * When you hover over the line, a popup opens up with the detailed
    two-line explanation.
  * When you click the icon, you jump to the relevant location with
    that popup.
  * When you hover over the error, or maybe in the popup, you see a
    list of field names, and clicking them shows the contents of the
    field.

Even a textual interface like xrepl can do something similar, where
the exposition of details goes gradually based on your needs.

More benefits:

* It's probably not hard to re-change the code, since it's keeping the
  multi-line aspect and the fields.

* Sounds like `error' is not going away in its current format which
  already does the first-line thing fine.

* Existing un-updated code works fine too.

* With the assumption that fields are not initially shown (which
  translates to some parameter), a lot more information can be added
  in them, even when they're irrelevant for human consumption.  For
  example, full paths to source files can blow up the message (eg,
  paths to the blamed file, the contract definition, and the
  contracted file; or list of paths in a cycle; or showing a
  *complete* stacktrace).

-- 
          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
                    http://barzilay.org/                   Maze is Life!

_________________________
  Racket Developers list:
  http://lists.racket-lang.org/dev

Reply via email to