2012-06-03 4 views
4

벡터지도에 개체를 추가하는 방법을 알아 내려고하고 있습니다.클로저에 추가 영구 벡터지도

(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

정말로 감사합니다. :). 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"))) 

즉 - 내용에 개체의 목록을 만들 수 있습니다.

관련 문제