2011-12-26 39 views
25

Tôi có thể thề tôi đã alength làm việc trước đây, nhưng tôi hoàn toàn không biết những gì tôi đang làm sai ngay bây giờ:Clojure chiều dài của chuỗi

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 

Những gì tôi nên làm để có được chiều dài của một danh sách/mảng trong Clojure?

Trả lời

32

Khi docstring nói, alength công trình trên mảng Java ™, chẳng hạn như một String[] hoặc Integer[], đó chắc chắn là một loại không tương thích với các danh sách Clojure hoặc vectơ, mà bạn muốn sử dụng 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; là cách kỳ lạ toStringdefined để xuất cho mảng gốc Object.

+5

Lưu ý rằng 'count' cũng hoạt động đối với mảng. 'alength' chỉ cần trong mã quan trọng tốc độ mà bạn đã biết rằng bạn có một mảng và cần truy cập trực tiếp. 'count' sẽ chậm hơn ở đây, bởi vì nó tổng quát hơn. – kotarak

41

Hãy thử sử dụng count:

(count '(1 2 3)) 
(count [1 2 3]) 
+1

haha, đây là phần còn thiếu! – CodeFarmer

3

Đây có thể là quá mức cần thiết, nhưng bạn có thể bắt chước chức năng chiều dài Common LISP của như thế này:

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

Bạn có thể làm điều đó bằng cách đệ quy:

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

Hy vọng điều đó sẽ hữu ích!

Các vấn đề liên quan