как создать большой вектор в clojure - PullRequest
6 голосов
/ 20 июля 2009

Как мне выделить вектор с 1042 пустыми индексами?
Будет ли хранилище для него лениво выделяться?
как это

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

Ответы [ 4 ]

14 голосов
/ 21 июля 2009

Кажется, что векторы не редки, поэтому вы должны указать значение для каждого индекса при создании вектора. Кажется, самый простой способ - вызвать (vec) для последовательности.

(vec (repeat 1042 nil))

Эти значения не создаются лениво, кажется.

5 голосов
/ 07 февраля 2011

Если ваши данные настолько редки, то рассмотрите возможность использования пустой карты вместо вектора .... тогда вы получите неограниченное количество лениво распределенных пустых индексов бесплатно!

(def a {})
(def b (assoc a 1041 42))
(b 1041) 
--> 42
5 голосов
/ 21 июля 2009

Если вы хотите что-то не ленивое, но избегающее некоторых накладных расходов, вы можете сделать:

(vec (make-array Object 1024))

Обратите внимание, assoc не изменяет вектор, он возвращает новый вектор с одним из измененных значений. Векторы неизменны. Ваш код никогда не будет работать как опубликовано.

4 голосов
/ 21 июля 2009
(apply vector (take 1024 (repeat nil)))

... ленивый

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...