At the moment assert macro accepts only a single argument - a test. If the test fails (is false), an exception is thrown. But the only information available (until we have better introspection tools) is the test _expression_. This causes problems when working on many items that should satisfy an assertion, but the assertion expression is the same for all of them (like, when iterating through a sequence) - it is impossible to see for which items exactly the assertion fails.
For this reason I think assert macro should accept another parameter - something to construct a meaningful assertion failure reason. A simplistic approach would be to just pass a string that has been constructed using str function. But this would involve too much unnecessary computation/consing since assertions are usually expected not to fail (in which case the failure message is not needed and should not be constructed). So my proposed (below) accepts a second parameter, which should be a form that results in a string. It could also accept variable number of parameters and implicitly call str on them, but that I think is a bad style. Comments welcome. And I hope some variation of it makes it to the clojure.core. (defmacro assert "Evaluates expr and throws an exception if it does not evaluate to logical true. message, if present, should be a an expression that evaluates to string describing the assertion failure." ([x] `(when-not ~x (throw (new Exception (str "Assert failed: " (pr-str '~x)))))) ([x message] `(let [message# (fn [] ~message)] (when-not ~x (throw (new Exception (str "Assert failed: " (message#)))))))) -- Jānis Džeriņš --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---