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

Reply via email to