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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.