Search code examples
clojurefunctional-programming

Clojure length of sequence


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?


Solution

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