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

Reply via email to