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!
Author by
wrongusername
Updated on May 21, 2020Comments
-
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?