2012-06-03 91 views
4

我試圖找出一種方法來添加一個對象到矢量地圖。添加到clojure持久性向量圖

(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個對象。任何幫助將非常appriciated

回答

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

謝謝你的工作真的很棒:)。我對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"))) 

換句話說 - 創建一個內容對象的列表。