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.