2011-12-26 15 views
25

podría haber jurado que tenía alength trabajar previamente, pero no acabo de saber lo que estoy haciendo mal en este momento:longitud de la secuencia de Clojure

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 

Qué debo hacer para obtener la longitud de una lista/matriz en Clojure?

Respuesta

32

Como dice la cadena de documentación, alength trabajos sobre matrices Java ™, como un String[] o Integer[], que es definitivamente un tipo incompatible con las listas o vectores de Clojure, para el que desea utilizar 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; es la forma extraña toString es defined para la salida de matrices nativas Object.

+5

Tenga en cuenta que 'count' también funciona para las matrices. 'alength' solo se necesita en el código de velocidad crítica donde ya sabe que tiene una matriz y necesita acceso directo. 'count' sería más lento aquí, porque es más genérico. – kotarak

41

Intente utilizar count:

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

jaja, esta es la pieza que falta! – CodeFarmer

3

Esto puede ser excesiva, pero se podía imitar la función de la longitud de Common Lisp como esto:

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

Usted puede hacer que el uso de la forma recursiva:

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

Espero que ayude!

Cuestiones relacionadas