web-dev-qa-db-fra.com

Longueur de la séquence

J'aurais pu jurer que j'avais alength travaillé auparavant, mais je ne sais pas trop ce que je ne fais pas bien maintenant:

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

Que devrais-je faire pour obtenir la longueur d'une liste/d'un tableau dans Clojure?

29
wrongusername

Comme le dit la docstring, alength fonctionne sur les baies Java ™, telles que String[] ou Integer[], qui est définitivement un type incompatible avec les listes ou les vecteurs Clojure pour lesquels vous souhaitez utiliser 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; est la façon bizarre toString est defini pour afficher les tableaux Object natifs.

34
skuro

Essayez d'utiliser count:

(count '(1 2 3))
(count [1 2 3])
46
Óscar López

Il devrait être count .

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

C'est peut-être excessif, mais vous pouvez imiter la fonction de longueur de Common LISP comme ceci:

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

Vous pouvez le faire en utilisant la méthode récursive:

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

J'espère que ça aide! 

0
Abner Terribili