If you read the source for comp, you'll find that anything more than 3 args
gets turned into something like reduce anyways:
(defn comp
"Takes a set of functions and returns a fn that is the composition
of those fns. The returned fn takes a variable number of args,
applies the rightmost of fns to the args, the next
fn (right-to-left) to the result, etc."
{:added "1.0"
:static true}
([] identity)
([f] f)
([f g]
(fn
([] (f (g)))
([x] (f (g x)))
([x y] (f (g x y)))
([x y z] (f (g x y z)))
([x y z & args] (f (apply g x y z args)))))
([f g h]
(fn
([] (f (g (h))))
([x] (f (g (h x))))
([x y] (f (g (h x y))))
([x y z] (f (g (h x y z))))
([x y z & args] (f (g (apply h x y z args))))))
([f1 f2 f3 & fs]
(let [fs (reverse (list* f1 f2 f3 fs))]
(fn [& args]
(loop [ret (apply (first fs) args) fs (next fs)]
(if fs
(recur ((first fs) ret) (next fs))
ret))))))
On Wed, May 7, 2014 at 10:34 AM, John Mastro <[email protected]>wrote:
> Hi,
>
> Mike Fikes <[email protected]> wrote:
> > In fact, section 5 of that document defines comp as a reduce
> > involving the identify function in some way. (Now, I want to re-read
> > this paper, but translated into Clojure.)
>
> Here's one definition of comp in terms of reduce:
>
> (defn comp [& fs]
> (reduce (fn [result f]
> (fn [& args]
> (result (apply f args))))
> identity
> fs))
>
> It's probably a bit clearer with one of the anonymous functions pulled
> out and named:
>
> (defn comp [& fs]
> (letfn [(chain [result f]
> (fn [& args]
> (f (apply result args))))]
> (reduce chain identity fs)))
>
> They're less efficient than clojure.core/comp's implementation, but I
> love the versatility of {reduce,fold,whatever}.
>
> Best regards,
>
> John
>
> --
> 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.
>
--
“One of the main causes of the fall of the Roman Empire was that–lacking
zero–they had no way to indicate successful termination of their C
programs.”
(Robert Firth)
--
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.