Your second `foo` call fails in 1.2 as well. If there was ever a time when it would have succeeded, it would have been a bug. Since `foo` is a macro, it receives its arguments unevaluated, so `(str "baz" 34)` will always be received as a list of three values.
The syntax-quote precondition simply expands into a list containing the symbol 'clojure.core/string? and the value of bar; this is a logically-true value, and so does not trigger any error. You want something like: (defmacro foo [bar & body] `(let [bar# ~bar] (when-not (string? bar#) (IllegalArgumentException. "msg")) ...)) - Chas On Mar 20, 2012, at 8:34 AM, Shantanu Kumar wrote: > Hi, > > The way preconditions are invoked in Clojure 1.3.0 seems to have > changed since Clojure 1.2: > > (defmacro foo > [bar & body] > {:pre [(string? bar)]} > ...) > > (foo "bar34" ...) ; doesn't complain, which is OK > (foo (str "baz" 34) ...) ; Error! (I wanted this to pass) > > When I write the precondition like this: > > {:pre [`(string? ~bar)]} > > It doesn't seem to check the precondition at all in 1.3.0. > > Can somebody suggest me what am I missing? I want both the examples > above to be verified and passed as OK. > > 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