But it doesn't know when it sees the ) that ] is missing, it might not be:
(prn [10)]
i.e. the ) has nothing to do with the [, there might not even be a
pending aggregate:
user=> )
java.lang.Exception: Unmatched delimiter: )
Rich
Interesting. Can there ever be a purpose in having
something other than a list before the tail position of
a 'do'?
Hm, I suppose you could make calls that have side-effects
within a map or vector literal, although that would be weird
since the map or vector itself would be thrown away:
(do
[(println "why??")]
5)
So even if the compiler ought to let that pass, is there
ever a purpose in having a bare symbol before the tail
position of a 'do'?
(do
samurai
10)
It might be nice to get a "useless bare symbol" warning in
cases like this.
I'd be happy to try to write a patch for this if one is
welcome.
> (if-let [a 1]
> (println a)
> a
> (inc c))
> java.lang.IllegalArgumentException: if-let requires a vector for its
> binding (NO_SOURCE_FILE:0)
> ;; rather cryptic errors from if-let when not quite right, like an
> illusionist using misdirection to awe the audience
This message is the result of an earlier attempt at specific
and helpful error messages. It is based on the assumption
that you're trying to use an old form of if-let:
(if-let [a b] my-pair
a
(inc c))
java.lang.IllegalArgumentException: if-let requires a vector for its
binding (NO_SOURCE_FILE:0)
Would you recommend a more general and therefore more
accurate message? Something like "your if-let syntax is
incorrect"?
> (javax.swing.UIManager/setLookAndFeel
> javax.swing.UIManager/getSystemLookAndFeelClassName)
> java.lang.Exception: Unable to find static field:
> getSystemLookAndFeelClassName in class javax.swing.UIManager
> (NO_SOURCE_FILE:7)
> ;; this one drives me nuts, I forget to call the method
> ;; if you don't read carefully it looks like maybe I just typoed the
> long method name so I spend about 10minutes checking javadocs, cutting
> and pasting, importing etc
> ;; The error while correct seems a bit odd seeing Class/method looks a
> method (though I understand why it isn't).
So in this case the message is accurate but too general?
These must be hard to get right! I suppose the compiler
could look for a no-arg method by that name and suggest that
specific cause in the message.
> (java.lang.Math/abs 2/3)
> java.lang.IllegalArgumentException: No matching method found: abs
> (NO_SOURCE_FILE:0)
> ;; abs wont work on ratios, but the error message doesn't give the
> signature being sought.
> ;; abs for java numbers exists, abs for ratios doesn't.
> ;; It is not always obvious that 2/3 is a ratio if it is a passed in
> variable.
I agree that it'd be helpful to list the arg types passed in:
"No 'abs' method found for [clojure.lang.Ratio]"
I wouldn't expect this to be too hard to patch either.
--Chouser
It seems like this could be caught at read time, just by
having the Map classes complain about non-even-length init arrays.
--Chouser