Thanks, this is perfect. Juxt is the key. I knew that it existed, but I just couldn't remember what it was called. I think your implementation fits the bill exactly.
On Sunday, March 1, 2015 at 11:43:00 PM UTC-5, Thomas Hicks wrote: > > I'm not quite sure what you want to do here in the general case but.....a > few thoughts: > > -> is implemented as a macro, whereas reduce and reductions are functions. > Depending on what you really want you may need a macro over a function. > > Note that reduce is picky about the reducing function it takes: it must be > function of two arguments. This is very different from the operation of the > threading macro (->). > > If you want to implement this as a function, you might look at the > implementation of juxt or comp for ideas since they are HOFs (functions > taking other functions as arguments). > > If functions f, g, and h all take one argument you can implement the > specific example you show as: ((juxt f (comp g f) (comp h g f)) 1) > For functions of one argument this could be generalized to take multiple > arguments and return vectors of composed applications: > > (defn intermediates [fns] > (let [f (fn [x] ((apply juxt (map #(apply comp (reverse (take %1 fns))) > (range 1 (inc (count fns))))) x)) ] > (fn [& xs] (map f xs)) )) > > (def f inc) > (defn g [x] (* x 2)) > (defn h [n] (+ n 5)) > > ((intermediates [f g]) 5) > ;=> ([6] [12]) > > ((intermediates [f g h]) 5) > ;=> ([6 12 17]) > > ((intermediates [f g h]) 5 7 9) ; each vector is [(f x) (g (f x)) (h > (g (f x)))] > ;=> ([6 12 17] [8 16 21] [10 20 25]) > > cheers, > -tom > > > On Sunday, March 1, 2015 at 2:16:06 PM UTC-7, Bill Allen wrote: >> >> Hopefully that makes sense. Let me illustrate. >> >> (reduce + [1 2 3 4]) >> ;=> 10 >> (reductions + [1 2 3 4) >> ;=> (1 3 6 10) >> >> (-> 1 f g h) >> ;=> (h (g (f 1))) >> >> I'm hoping to get a function that behaves like: >> (--> 1 f g h) >> ;=> ((f 1) (g (f 1) (h (g (f 1)))) >> >> Any ideas? >> >> Regards, >> Bill >> >> -- 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/d/optout.