On Mon, Jun 10, 2013 at 6:55 PM, Cedric Greevey <cgree...@gmail.com> wrote:
> Hmmm? Maybe > > (defn if-and [x & tests] > (if (every? true? (map #(% x) tests)) x)) > > for a version that's a function, would short-circuit but for seq chunking, > and returns nil or x. > Yes, that's why you might as well use this: user> (defn allpreds [x & ts] (every? #(% x) ts)) #'user/allpreds user> (defn if-and [x & ts] (when (apply allpreds x ts) x)) #'user/if-and Which is properly short-circuiting without worrying about chunking. > > Incidentally, I think you can dechunk any seq with (map first (take-while > seq (iterate next s))), but haven't tested this. (If s is chunked, it will > still be realized in chunks; but if the output is wrapped in (map > expensive-fn ...) *that* won't race ahead calling expensive-fn on elements > not yet needed by the caller. I think.) > > > On Mon, Jun 10, 2013 at 9:18 PM, Jiaqi Liu <liujiaq...@gmail.com> wrote: > >> you can just use (every? true? '(arg1 arg2 ....)) or def a simple >> function . >> i think the Core is powerful enough. >> >> >> 2013/6/11 Cedric Greevey <cgree...@gmail.com> >> >>> 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. >>> >>> >>> >> >> >> >> -- >> >> ------------------------------------**** >> >> 刘家齐 (Jacky Liu) >> >> ** >> >> 手机:15201091195 邮箱:liujiaq...@gmail.com >> >> Skype:jacky_liu_1987 QQ:406229156 >> >> -- >> -- >> 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. > > > -- 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.