2011-12-26 15 views
25

avrei giurato che avevo alength lavorare in precedenza, ma io non so bene cosa sto facendo male in questo momento:lunghezza Clojure sequenza

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 

Cosa dovrei fare per ottenere la lunghezza di un lista/matrice in Clojure?

risposta

32

Come il docstring dice, alength opere su array Java ™, come ad esempio un String[] o Integer[], che è sicuramente un tipo non compatibile con le liste Clojure o vettori, per i quali si desidera utilizzare 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; è il modo strano toString è defined per l'output per gli array nativi Object.

+5

Nota, che 'count' funziona anche per gli array. 'alength' è necessario solo nel codice di velocità critica in cui si sa già che si dispone di un array e che è necessario l'accesso diretto. 'count' sarebbe più lento qui, perché è più generico. – kotarak

41

Prova utilizzando count:

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

haha, questo è il pezzo mancante! – CodeFarmer

3

Questo può essere eccessivo, ma si potrebbe imitare la funzione di lunghezza di Common Lisp come questo:

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

è possibile farlo utilizzando il modo ricorsivo:

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

Spero che aiuti!

Problemi correlati