If the condition is true of the transformed object (e.g., it's "if this condition isn't met, use this method to massage it so it is"), then there's this:
(first (filter condition? (map #(%1 obj) [identity transformation]))) It can even use laziness to avoid the transformation, but you'll need (list identity transformation) instead of [identity transformation] to avoid chunking the seq. And it can then be extended with successively more-expensive transformations that it will try until one makes condition? true of its output. On Sat, May 25, 2013 at 8:35 AM, Chris Ford <christophertf...@gmail.com>wrote: > Here's how I did it, which is similar to what atkaaz and Jim were > suggesting: > > (defn whenever [x applies-to? f] (if (applies-to? x) (f x) x)) > (whenever obj :attr #(assoc % :attr something)) > (whenever obj some-test some-transformation) > > > On 25 May 2013 15:19, atkaaz <atk...@gmail.com> wrote: > >> >> >> >> On Sat, May 25, 2013 at 3:16 PM, Steven Degutis <sbdegu...@gmail.com>wrote: >> >>> >>> Also I just remembered, sometimes to solve the second one, I would do ((if >>> condition transformer identity) obj) but that feels ugly. >>> >> but the condition has to contain obj, so obj is referred twice ? >> otherwise i kinda like it >> >>> >>> >>> On Sat, May 25, 2013 at 7:13 AM, Cedric Greevey <cgree...@gmail.com>wrote: >>> >>>> Seems to me that (merge {:attr something} obj) answers the OP's >>>> question, mentions obj only once, and is short and pithy. OTOH it computes >>>> the "something" every time, whether it's needed or not, so in cases where >>>> "something" is expensive to compute (or has side effects that should only >>>> happen if it winds up in the output!) then another method needs to be used. >>>> >>>> >>>> On Sat, May 25, 2013 at 8:08 AM, atkaaz <atk...@gmail.com> wrote: >>>> >>>>> like: >>>>> => (definline pred-transform [obj pred tf] >>>>> `(let [o# ~obj] >>>>> (if (~pred o#) o# >>>>> (~tf o#)))) >>>>> #'cgws.notcore/pred-transform >>>>> >>>>> => (pred-transform (println 1) nil? #(println % ".")) >>>>> 1 >>>>> nil >>>>> => (pred-transform (println 1) #(not (nil? %)) #(println % ".")) >>>>> 1 >>>>> nil . >>>>> nil >>>>> >>>>> >>>>> On Sat, May 25, 2013 at 3:07 PM, atkaaz <atk...@gmail.com> wrote: >>>>> >>>>>> in which case it does get evaluated twice if form: >>>>>> => (pred-transform (println 1) #(not (nil? %)) #(println % ".")) >>>>>> 1 >>>>>> 1 >>>>>> nil . >>>>>> nil >>>>>> >>>>>> => (pred-transform (println 1) nil? #(println % ".")) >>>>>> 1 >>>>>> 1 >>>>>> nil >>>>>> >>>>>> so maybe a let + gensym would be in order? >>>>>> >>>>>> >>>>>> >>>>>> On Sat, May 25, 2013 at 3:04 PM, atkaaz <atk...@gmail.com> wrote: >>>>>> >>>>>>> Shouldn't it be like: >>>>>>> >>>>>>> (definline pred-transform [obj pred tf] >>>>>>> `(if (~pred ~obj) ~obj >>>>>>> (~tf ~obj))) >>>>>>> => (pred-transform 1 #(not (nil? %)) println) >>>>>>> 1 >>>>>>> => (pred-transform 1 nil? println) >>>>>>> 1 >>>>>>> nil >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Sat, May 25, 2013 at 2:55 PM, atkaaz <atk...@gmail.com> wrote: >>>>>>> >>>>>>>> just wondering if obj is a form does it get evaluated twice? >>>>>>>> >>>>>>>> >>>>>>>> On Sat, May 25, 2013 at 2:51 PM, Jim - FooBar(); < >>>>>>>> jimpil1...@gmail.com> wrote: >>>>>>>> >>>>>>>>> no need for macros... :) >>>>>>>>> >>>>>>>>> (definline safe-assoc [m k v] >>>>>>>>> `(if (contains? ~m ~k) ~m >>>>>>>>> (assoc ~m ~k ~v))) >>>>>>>>> >>>>>>>>> (definline pred-transform [obj pred tf] >>>>>>>>> `(if ~(pred obj) ~obj >>>>>>>>> ~(tf obj))) >>>>>>>>> >>>>>>>>> Jim >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On 25/05/13 12:44, atkaaz wrote: >>>>>>>>> >>>>>>>>> may I see the macro for the latter, if you decide to go that way ? >>>>>>>>> thx >>>>>>>>> >>>>>>>>> >>>>>>>>> On Sat, May 25, 2013 at 2:24 PM, Steven Degutis < >>>>>>>>> sbdegu...@gmail.com> wrote: >>>>>>>>> >>>>>>>>>> There are two patterns I find in my code that I'm still unhappy >>>>>>>>>> with but I don't know how to clean up. >>>>>>>>>> >>>>>>>>>> The first is: (if (:attr obj) obj (assoc obj :attr something)) >>>>>>>>>> >>>>>>>>>> I'm basically saying, give this hash-map an attribute if it >>>>>>>>>> doesn't already have it. And just return the thing with an attribute, >>>>>>>>>> regardless if I had to add it or not. >>>>>>>>>> >>>>>>>>>> This version is ugly because it repeats obj three times. I >>>>>>>>>> could write my own macro to de-duplicate it, but I avoid doing that >>>>>>>>>> when I >>>>>>>>>> can because there's usually a better built-in solution that I just >>>>>>>>>> don't >>>>>>>>>> know about yet. >>>>>>>>>> >>>>>>>>>> The second is like it: (if (some-test obj) obj >>>>>>>>>> (some-transformation obj)) >>>>>>>>>> >>>>>>>>>> In this one, I just want to return the object, but maybe >>>>>>>>>> transform it first. But the reference to obj happens three times! >>>>>>>>>> Still >>>>>>>>>> feels like it could be cleaned up. >>>>>>>>>> >>>>>>>>>> Any thoughts on how to clean these up? >>>>>>>>>> -- >>>>>>>>>> -- >>>>>>>>>> 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. >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> -- >>>>>>>>> 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. >>>>> >>>>> >>>>> >>>> >>>> -- >>>> -- >>>> 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 a topic in the >>>> Google Groups "Clojure" group. >>>> To unsubscribe from this topic, visit >>>> https://groups.google.com/d/topic/clojure/1GFesvqspwk/unsubscribe?hl=en >>>> . >>>> To unsubscribe from this group and all its topics, 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. >>> >>> >>> >> >> -- >> -- >> 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. > > > -- -- 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.