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/main/clj/org/bituf/clj_miscutil.clj#cl-1009 > > 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