Truss <https://github.com/ptaoussanis/truss>also has good support for :pre and :post conditions <https://github.com/ptaoussanis/truss#assertions-within-prepost-conditions>
On Monday, July 11, 2011 at 7:40:48 PM UTC+2, frye 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 > twas...@gmail.com <javascript:> > 416.843.9060 > > > > On Sun, Jul 3, 2011 at 11:42 AM, Shantanu Kumar <kumar.s...@gmail.com > <javascript:>> 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 clo...@googlegroups.com >> <javascript:> >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+u...@googlegroups.com <javascript:> >> 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 --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.