添加到clojure持久性矢量地图

时间:2012-06-03 08:22:07

标签: 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个对象。任何帮助都非常适合

2 个答案:

答案 0 :(得分: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
#<Atom@4204: [#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"}]>

答案 1 :(得分:3)

missingfaktor的回答是正确的,如果你真的需要改变某些东西,但是这样做会更为正常:

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

创建包含内容的对象列表。