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
> [email protected] <javascript:>
> 416.843.9060
>
>
>
> On Sun, Jul 3, 2011 at 11:42 AM, Shantanu Kumar <[email protected]
> <javascript:>> wrote:
>
>>
>>
>> On Jul 3, 7:39 pm, Timothy Washington <[email protected]> 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 [email protected]
>> <javascript:>
>> Note that posts from new members are moderated - please be patient with
>> your first post.
>> To unsubscribe from this group, send email to
>> [email protected] <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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.