i'm pretty clueless about how hard it would be, i'm figuring it can
get arbitrarily complicated and expensive and time sinky, but i'd like
to make a small note about error messages from Clojure -- they seem to
be sometimes more complicated or intimidating or unhelpful than a
newbie such as myself might benefit from :-)
one example is that stack traces come out a lot and can obfuscate the
real issue. so even though there is an error which might be helpful
enough to figure out what the fix is, it might scroll away due to the
stack dump, and the stack dumps can be scary in and of themselves.
(see below).
there are other things i think i've seen but don't have examples
available right now: i think i've seen errors which were pretty far
away from the actual underlying cause in terms of what line they said
the error was on (like one i think said error on like 224 when i only
had like 10 lines in the program); or in terms of the concept involved
(like some scary compiler-internal-looking error for mismatched parens
or whatever).
user=> (defn foo [] (let [d1 (Date)] d1))
java.lang.Exception: Unable to resolve symbol: Date in this context
clojure.lang.Compiler$CompilerException: NO_SOURCE_FILE:1: Unable to
resolve symbol: Date in this context
at clojure.lang.Compiler.analyzeSeq(Compiler.java:3364)
at clojure.lang.Compiler.analyze(Compiler.java:3296)
at clojure.lang.Compiler.access$200(Compiler.java:37)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:3125)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:3357)
at clojure.lang.Compiler.analyze(Compiler.java:3296)
at clojure.lang.Compiler.analyze(Compiler.java:3271)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:3346)
at clojure.lang.Compiler.analyze(Compiler.java:3296)
at clojure.lang.Compiler.analyze(Compiler.java:3271)
at clojure.lang.Compiler.access$100(Compiler.java:37)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:3022)
at clojure.lang.Compiler$FnMethod.parse(Compiler.java:2889)
at clojure.lang.Compiler$FnMethod.access$1100(Compiler.java:2800)
at clojure.lang.Compiler$FnExpr.parse(Compiler.java:2523)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:3355)
at clojure.lang.Compiler.analyze(Compiler.java:3296)
at clojure.lang.Compiler.analyze(Compiler.java:3271)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:3346)
at clojure.lang.Compiler.analyze(Compiler.java:3296)
at clojure.lang.Compiler.access$200(Compiler.java:37)
at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:324)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:3357)
at clojure.lang.Compiler.analyze(Compiler.java:3296)
at clojure.lang.Compiler.analyze(Compiler.java:3271)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:3346)
at clojure.lang.Compiler.analyze(Compiler.java:3296)
at clojure.lang.Compiler.analyze(Compiler.java:3271)
at clojure.lang.Compiler.eval(Compiler.java:3384)
at clojure.lang.Repl.main(Repl.java:75)
Caused by: java.lang.Exception: Unable to resolve symbol: Date in this context
at clojure.lang.Compiler.resolveIn(Compiler.java:3471)
at clojure.lang.Compiler.resolve(Compiler.java:3446)
at clojure.lang.Compiler.analyzeSymbol(Compiler.java:3431)
at clojure.lang.Compiler.analyze(Compiler.java:3284)
at clojure.lang.Compiler.analyze(Compiler.java:3271)
at clojure.lang.Compiler.access$100(Compiler.java:37)
at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:2421)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:3359)
... 29 more