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.