Clojure длина последовательности - PullRequest
31 голосов
/ 26 декабря 2011

Я мог бы поклясться, что раньше работал alength, но я не совсем понимаю, что я делаю сейчас неправильно:

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

Что мне делать, чтобы получить длину списка / массива в Clojure?

Ответы [ 5 ]

49 голосов
/ 26 декабря 2011

Попробуйте использовать count:

(count '(1 2 3))
=> 3
(count [1 2 3])
=> 3
36 голосов
/ 26 декабря 2011

Как говорит строка документации, alength работает с массивами Java ™, такими как String[] или Integer[], что, безусловно, является несовместимым типом со списками или векторами Clojure, для которых вы хотите использовать 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; - странный способ toString - это , определенный для вывода для собственных Object массивов.

14 голосов
/ 26 декабря 2011

Это должно быть count.

user=> (count '(1 2 3))
3
2 голосов
/ 02 июня 2014

Это может быть излишним, но вы можете имитировать функцию длины в Common LISP следующим образом:

(def length 
 (fn [lst]
  (loop [i lst cnt 0]
   (cond (empty? i) cnt
     :t (recur (rest i)(inc cnt))))))
0 голосов
/ 18 июля 2017

Вы можете сделать это, используя рекурсивный способ:

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

Надеюсь, это поможет!

...