Clojure序列的长度

时间:2011-12-26 01:43:02

标签: clojure functional-programming

我本来可以发誓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 个答案:

答案 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)))))

希望它有所帮助!