Ken & Alex,
Why you aren't calling empty? when you want to check if a collection
is empty?

Isn't (if s) supposed to return true if s is empty ?

On Dec 6, 12:27 am, Ken Wesson <kwess...@gmail.com> wrote:
> On Sun, Dec 5, 2010 at 5:16 PM, Robert McIntyre <r...@mit.edu> wrote:
> > Your function never actually ends  because even the empty list
> > evaluates to true :)
>
> > rlm.dna-melting> (if (rest '()) true false)
> > true
>
> > rlm.dna-melting> (if (next '()) true false)
> > false
>
> > so, changing your list length function to use next will work
>
> > rlm.dna-melting> (defn list-length [col] (if col (+ 1 (list-length
> > (next col))) 0))
> > #'rlm.dna-melting/list-length
> > rlm.dna-melting> (list-length (range 5))
> > 5
>
> > hope that helps,
> > --Robert McIntyre
>
> Yeah, but
>
> user=> (list-length ())
> 1
>
> :)
>
> And the original code will still bomb on long enough lists. How about:
>
> (defn list-length [coll]
>   (let [ll (fn [n s]
>              (if s
>                (recur (inc n) (next s))
>                n))]
>     (ll 0 (seq coll))))
>
> user=> (list-length ())
> 0
> user=> (list-length (range 5))
> 5
> user=> (list-length (range 10000000))
> 10000000
>
> The inner function takes a second argument that is the count-so-far.
> This is so that the recursion can be turned into a tail call. As you
> can see, no stack overflow even on a very long input.

-- 
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