As I am the culprit of having introduced it with a naive example, I'd better admit it may not be very useful in practical scenarios across a wide variety of use cases. For example, when there is an assertion error with message "`m` should be a map" 14 levels down the stack, I'd really wish it said "`m` -- Expected: map, Found: vector [:foo :bar]" so that I can debug it quickly.
Pre-conditions and Post-conditions are a valuable debugging aid, and to enable that we need very precise information. Unfortunately passing a string error message cannot encapsulate enough error context. A more complex example can be where the correctness of input must be determined collectively (in association with other args) -- in those cases one can only fall back on comparing input values and raise IllegalArgumentException accordingly. Regards, Shantanu On Jul 11, 10:40 pm, Timothy Washington <twash...@gmail.com> wrote: > Note: This message was originally posted by ' Shantanu' on the "*Re: Clojure > for large programs*" thread. > > I took a look at Shantanu's macros, and I like the concept a lot. But I > would prefer something baked into the :pre condition itself. The reason is > that it just removes a layer of indirection. If you dig into '* > clj/clojure/core.clj*', you can see that the 'fn' macro is using 'assert' to > test these conditions. Assert allows error messages to be applied, ie: > > *user => (assert false) * > > *user => (assert false "fubar") * > > However, (defmacro fn ...) assumes that just the boolean condition is being > passed in, A). But I'd like to have the option to pass in a message B). > > *A) * > > ** > > *(def fubar * > > * (fn []* > > * {:pre [ (true? false) ] }* > > * (println "Hello World")))* > > *(fubar)* > > * > * > > *B) * > > *(def thing * > > * (fn []* > > * {:pre [ [(true? false) "A false message"] ] }* > > * (println "Hello World")))* > > *(thing)* > > I reworked the 'fn' macro, only for the :pre condition, as a demonstration > (see > here <http://pastebin.com/fETV1ejJ>). The calling semantics don't change > that much. Is there any interest in putting this into core? I'd > use Shantanu's workaround otherwise, or in the interim. > > Thanks > > Tim Washington > twash...@gmail.com > 416.843.9060 > > On Sun, Jul 3, 2011 at 11:42 AM, Shantanu Kumar > <kumar.shant...@gmail.com>wrote: > > > > > > > > > > > On Jul 3, 7:39 pm, Timothy Washington <twash...@gmail.com> wrote: > > > I'm using pre / post assertions quite a bit in a project I'm building. > > And I > > > too would love to see better or custom error messages for each assertion. > > > That should be possible with a macro. For example, I use this: > > >https://bitbucket.org/kumarshantanu/clj-miscutil/src/acfb97c662d9/src... > > > Maybe you need something like this(?): > > > (defmacro verify-my-arg > > "Like assert, except for the following differences: > > 1. does not check for *assert* flag > > 2. throws IllegalArgumentException" > > [err-msg arg] > > `(if ~arg true > > (throw (IllegalArgumentException. ~err-msg)))) > > > Then use it thus: > > > (defn foo [m] > > {:pre [(verify-my-arg "m must be a map" (map? m))]} > > (println m)) > > > Regards, > > Shantanu > > > -- > > 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 > > Note that posts from new members are moderated - please be patient with > > your first post. > > 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 -- 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 Note that posts from new members are moderated - please be patient with your first post. 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