2012-06-03 2 views
4

Я пытаюсь найти способ добавить объект к векторной карте.Добавить в clojure persistent vector map

(defstruct item :name) 
(def itemList []) 

(defn add-item [db & item] 
    (into db item)) 

(defn get-records[] 
    (doseq [i (range 0 10 1)] 
    (add-records itemList (struct item "test") 
)) 

В конце цикла я хочу itemList содержит 10 объектов. Любая помощь будет очень полезна

ответ

4

Clojure - это функциональный язык программирования, и все его основные структуры данных неизменны и постоянны. Это также включает в себя вектор.

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

user=> (defrecord Item [name]) 
user.Item 

user=> (def item-list (atom [])) 
#'user/item-list 

user=> (defn add-item [db i] (swap! db #(conj % i))) 
#'user/add-item 

user=> (defn put-records [] 
     (doseq [i (range 10)] 
      (add-item item-list (Item. "test")))) 
#'user/put-records 

user=> (put-records) 
nil 

user=> item-list 
#<[email protected]: [#user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"}]> 
+0

Спасибо, что это сработало действительно замечательно :). Im совершенно новый для Clojure, можете ли вы порекомендовать какие-нибудь хорошие уроки, чтобы идти дальше. Спасибо – Jani

+0

@ user723056, см. [Эту тему] (http://stackoverflow.com/questions/2578837/comparing-clojure-books). – missingfaktor

3

missingfaktor является правильным, если вам действительно нужно мутировать что-то, но это было бы гораздо более нормальным иметь:

(defstruct item :name) 
(def itemList (for [i (range 10)] (struct item "test"))) 

другими словами - создать список объектов с содержимым.