2009-07-20 13 views
6

Come allocare un vettore con 1042 indici vuoti?
L'allocazione verrà allocata pigramente?
come questocome faccio a creare un vettore grande in clojure

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

Sto cercando di creare un vettore clojure persistente, non un array java –

risposta

14

Sembra che i vettori non siano sparsi quindi è necessario specificare un valore per ogni indice quando si crea il vettore. Il modo più semplice sembra essere quello di chiamare (vec) su una sequenza.

(vec (repeat 1042 nil)) 

Questi valori non vengono creati pigramente sembra.

+0

questo richiede la versione recente di clojure per fornire la ripetizione di 2 argomenti –

+0

in questi giorni (2012) questa è la risposta corretta - dovresti contrassegnare te stesso corretto, Arthur. –

+0

ti darò la tua parola su quello :) –

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

... è pigro

+2

Sei sicuro che sia pigro? Anche se (prendere 1024 (abrogazione nil)) è certamente pigro, penso che (applicare il vettore ...) forzerà la valutazione dell'intera sequenza. – mikera

+5

I vettori non sono mai pigri. – amalloy

5

Se si desidera qualcosa che non è pigro, ma che evita un certo overhead, si può fare:

(vec (make-array Object 1024)) 

nota, assoc non altera un vettore, restituisce un nuovo vettore con uno dei valori modificati. I vettori sono immutabili Il tuo codice non funzionerà mai come pubblicato.

+0

grazie per averlo indicato, ho modificato la domanda per archiviare l'array restituito dal membro –

+2

'make-array' restituisce un array Java, ma il suo inserimento in' vec' lo rende in un vettore Clojure. –

5

Se i vostri dati sono sparsi, prendete in considerazione l'utilizzo di una mappa vuota anziché di un vettore .... quindi otterrete un numero illimitato di indici vuoti allocati pigramente gratuitamente!

(def a {}) 
(def b (assoc a 1041 42)) 
(b 1041) 
--> 42 
Problemi correlati