Clojure length of sequence

35,275

Solution 1

As the docstring says, alength works on Java™ arrays, such as a String[] or Integer[], which is definitely an incompatible type with Clojure lists or vectors, for which you want to use count:

user=> (def x '(1 2 3))
#'user/x
user=> (def xa (to-array x))
#'user/xa
user=> (class x)
clojure.lang.PersistentList
user=> (class xa)
[Ljava.lang.Object;
user=> (alength xa)
3
user=> (alength x) 
java.lang.IllegalArgumentException: No matching method found: alength (NO_SOURCE_FILE:0)
user=> (count x)
3

[Ljava.lang.Object; is the weird way toString is defined to output for native Object arrays.

Solution 2

Try using count:

(count '(1 2 3))
=> 3
(count [1 2 3])
=> 3

Solution 3

It should be count.

user=> (count '(1 2 3))
3

Solution 4

This may be overkill, but you could imitate Common LISP's length function like this:

(def length 
 (fn [lst]
  (loop [i lst cnt 0]
   (cond (empty? i) cnt
     :t (recur (rest i)(inc cnt))))))

Solution 5

You can do that using the recursive way:

(defn length
 [list]
 (if (empty? list) 0
  (+ 1 (length (rest list)))))

Hope it helps!

Share:
35,275
wrongusername
Author by

wrongusername

Updated on May 21, 2020

Comments

  • wrongusername
    wrongusername almost 4 years

    I could have sworn I had alength working previously, but I don't quite know what I am doing wrong right now:

    user=> (alength '(1 2 3))
    IllegalArgumentException No matching method found: alength  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:79)
    user=> (alength [1 2 3])
    IllegalArgumentException No matching method found: alength  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:79)
    user=> (doc alength)
    -------------------------
    clojure.core/alength
    ([array])
      Returns the length of the Java array. Works on arrays of all
      types.
    nil
    

    What should I be doing to get the length of a list/array in Clojure?