2009-07-20 14 views
6

¿Cómo asigno un vector con 1042 índices vacíos?
¿Se va a asignar holgadamente el espacio de almacenamiento?
como estocómo puedo crear un vector grande en clojure

(def a (array-creation-function 1042)) 
(def b (assoc a 1041 42)) 
(b 1041) 
--> 42 
+0

Estoy buscando crear un vector de clojure persistente, no una matriz de Java –

Respuesta

14

Parece que los vectores no son escasos, por lo que debe especificar un valor para cada índice al crear el vector. La manera más fácil parece ser llamar (vec) en una secuencia.

(vec (repeat 1042 nil)) 

Estos valores no son creados con pereza que parece.

+0

esto requiere una versión reciente de clojure para proporcionar el 2 argumento de repetir –

+0

en estos días (2012) esta es la respuesta correcta - usted debe marcarse correctamente, arthur. –

+0

tomaré su palabra sobre eso :) –

4
(apply vector (take 1024 (repeat nil))) 

... es perezosa

+2

¿Estás seguro de que esto es vago? Aunque (tome 1024 (nulidad de revocación)) es ciertamente flojo, creo que (aplicar vector ...) forzará la evaluación de la secuencia completa. – mikera

+5

Los vectores nunca son flojos. – amalloy

5

Si quieres algo que no es perezoso, pero que evita algo de sobrecarga, que puede hacer:

(vec (make-array Object 1024)) 

Nota, assoc no altera un vector, devuelve un nuevo vector con uno de los valores modificados. Los vectores son inmutables. Tu código nunca funcionará como se publicó.

+0

gracias por señalar eso, he editado la pregunta para almacenar la matriz devuelta por la asociación –

+2

'make-array' devuelve una matriz de Java, pero envolverla en' vec' la convierte en un vector Clojure. –

5

Si sus datos son tan escasos, entonces considere usar un mapa vacío en lugar de un vector ... ¡luego obtendrá un número ilimitado de índices vacíos asignados de forma gratuita!

(def a {}) 
(def b (assoc a 1041 42)) 
(b 1041) 
--> 42 
Cuestiones relacionadas