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