Hello, it seems to me that your example is unnecessary complicated. Let's refactor it a bit before trying to obtain your goal.
First, your example can be, for the purpose of your goal, simplified as : (loop [a a0] (if (predicate-fn a) (return-fn a) (recur (recur-fn a)))) So now, what can we do with this ? you keep applying function recur-fn to a, starting with a = a0. This is a job for iterate : (iterate recur-fn a0) will create this lazy sequence starting with a0, and where each new value is made from (recur-fn a) Then you want to stop when predicate-fn returns true. This is a job for remove, for example : (first (remove (comp not predicate-fn) (iterate recur-fn a0))) The final step is to apply return-fn to the result: (return-fn (first (remove (comp not predicate-fn) (iterate recur-fn a0))) As for return-fn, predicate-fn and recur-fn : (def b f1) (def c (comp f2 b)) (def d (comp f3 c)) (def e (comp f4 d)) (def g (comp f5 c)) (def h (comp f5 f2)) (def return-fn e) (def predicate-fn #(if (or (f6? (b %)) (<= (g %) (h %)))) (def recur-fn #(f7 (d a) (b a))) Is it something like that you expected ? 2009/12/15 samppi <rbysam...@gmail.com> > I'm trying to rewrite a loop to use higher-level functions instead. > For pure functions f1, f2, f3, f4, f5, f6?, and f7, and a Clojure > object a0, how can one rewrite the following loop to use map, reduce, > etc.? > > (loop [a a0] > (let [b (f1 a) > c (f2 b) > d (f3 c) > e (f4 d) > g (f5 c) > h (-> e f2 f5)] > (if (or (f6? b) (<= g h)) > e > (recur (f7 d b))))) > > -- > 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<clojure%2bunsubscr...@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 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