There's also the defmacro route: (defmacro if-and [test-expr binding & tests] `(let [~binding ~test-expr] (and ~@(concat tests [binding]))))
Evaluates test-expr, then evaluates to the result of that if the tests all pass, and to a falsey value otherwise (in fact, the first falsey value returned by any of the tests). If you want only nil or the value, the and sexp can be changed to (if (and ~@tests) binding). Short-circuits at the first falsey test of course. Might be more convenient (fewer lambdas needed) sometimes and more efficient sometimes -- on the other hand, to use as a function itself it will need wrapping in a lambda: #(if-and % % tests-using-%). On Mon, Jun 10, 2013 at 4:31 PM, Ben Wolfson <wolf...@gmail.com> wrote: > On Mon, Jun 10, 2013 at 1:20 PM, Steven Degutis <sbdegu...@gmail.com>wrote: > >> Sometimes I've wanted a function that takes a value and a bunch of tests, >> and returns it if it passes every test, otherwise nil. >> >> So I wrote if-and: >> >> (if-and "foo" >> >> string? >> #(.startsWith % "f") >> #(.contains % "oo")) >> ;; => "foo" >> >> (if-and "foo" >> string? >> #(.startsWith % "f") >> #(.contains % "NOT IN THE STRING")) >> ;; => nil >> >> >> Source: >> https://github.com/evanescence/if-and/blob/master/src/if_and/core.clj >> >> Does this seem useful enough to put into core? >> >> > "Takes a value and a bunch of tests, and returns [the value] if it passes > every test" implies that (if-and false false?) should return false, but: > > user> (if-and false false?) > nil > > It's also kind of confusing to me *anyway* that (if-and false false?) > would return false and not true (to indicate that the supplied value passed > every test). Something like this seems more intuitive to me: > > user> (defn allpreds [x & ts] (every? #(% x) ts)) > #'user/allpreds > user> (allpreds false false?) > true > user> (allpreds nil false?) > false > > With if-and being definable in terms of allpreds: > > user> (defn if-and* [x & ts] (when (apply allpreds x ts) x)) > #'user/if-and* > user> (if-and* false false?) > false > user> (if-and* false nil?) > nil > > -- > Ben Wolfson > "Human kind has used its intelligence to vary the flavour of drinks, which > may be sweet, aromatic, fermented or spirit-based. ... Family and social > life also offer numerous other occasions to consume drinks for pleasure." > [Larousse, "Drink" entry] > > -- > -- > 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/groups/opt_out. > > > -- -- 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/groups/opt_out.