我本来可以发誓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中获取列表/数组的长度?
答案 0 :(得分:48)
尝试使用count
:
(count '(1 2 3))
=> 3
(count [1 2 3])
=> 3
答案 1 :(得分:35)
正如文档字符串所说,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
defined为本地Object
数组输出的奇怪方式。
答案 2 :(得分:14)
应为count
。
user=> (count '(1 2 3))
3
答案 3 :(得分:2)
这可能有点矫枉过正,但你可以像这样模仿Common LISP的长度函数:
(def length
(fn [lst]
(loop [i lst cnt 0]
(cond (empty? i) cnt
:t (recur (rest i)(inc cnt))))))
答案 4 :(得分:0)
您可以使用递归方式执行此操作:
(defn length
[list]
(if (empty? list) 0
(+ 1 (length (rest list)))))
希望它有所帮助!