Wonderful. I'm still getting used to juggling functions like this, rather than doing standard loops. But it's so much cleaner.
Thanks again, everyone; your explanations showed me not only how to solve my problem, but to organize my logic better too. On Dec 15, 2:32 pm, Laurent PETIT <laurent.pe...@gmail.com> wrote: > Of course you're right. I couldn't remember filter, was somehow "stuck" with > some which does not do the job of course, and playing with the doc did not > help since my version of clojure still has the bug on filter's lack of > documentation :-) > > 2009/12/15 Sean Devlin <francoisdev...@gmail.com> > > > > > On Dec 15, 4:05 pm, Laurent PETIT <laurent.pe...@gmail.com> wrote: > > > 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))) > > > Shouldn't this be: > > > (return-fn > > (first (filter 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 > > > > > > > <clojure%2bunsubscr...@googlegroups.com<clojure%252bunsubscr...@googlegroup > > s.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<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