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

Reply via email to