On Mon, Dec 6, 2010 at 4:02 AM, nickik <nick...@gmail.com> wrote: > The easy (and good) solution is to pass the running result onlong the > way. This can be done in diffrent ways. > > First the CL Style where you creat a new function in you function that > then does all the work. (from > Ken Wesson) > > (defn list-length [coll] > (let [ll (fn [n s] > (if s > (recur (inc n) (next s)) > n))] > (ll 0 (seq coll)))) > > I don't really like this because the core logic is somwhat hidden.
??? > Then we could use arity functions. (Alex Osborne) > > (defn list-length > ([coll] (list-length coll 0)) > ([coll n] (if-let [s (seq coll)] > (recur (rest s) (inc n)) > n))) > > This is nice style in my opinion Not in mine -- it exposes a public API of list-length-plus-some-integer that a) doesn't make much sense and b) is unlikely to be supported, since the implementation could be changed to one that doesn't expose this. Of course sometimes a user wants to add something to a length of a seq and then they could get a slight speedup by using (list-length s n) instead of (+ n (list-length s)), but that is c) premature optimization in the typical case. > but I would do it like this: > > (defn list-lenght [coll] > (loop [coll coll n 0] > (if (empty? coll) > n > (recur (rest coll) (inc n))))) > > or with seq instead of empty? > > (defn list-lenght [coll] > (loop [coll coll n 0] > (if (seq coll) > (recur (rest coll) (inc n)) > n))) > > Hope that helps a little. Why not (defn list-length [coll] (let [s (seq coll)] (loop [s s n 0] (if s (recur (next s) (inc n)) n)))) ? This may be slightly more efficient at no cost in clarity. -- 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