2012-04-12 38 views
1

我想使用來自Clojure的BaseX的內部數據類型來構建一個XML結構。clojure:for循環內容未被調用

(defn basex-elem [token-name dict] 
    (let [elem (org.basex.query.item.FElem. 
       (org.basex.query.item.QNm. token-name))] 
    (for [[k v] dict] 
     (do 
     (println "THIS IS REACHED") 
     (let [k-name (org.basex.query.item.QNm. (.getName k)) 
       k-attr (org.basex.query.item.FAttr. 
         k-name 
         org.basex.util.Token/token v))] 
      (.add elem k-attr)))) 
    elem)) 

當使用這種哭創建元素,「這是達到」從不打印:

(def test-elem (basex-elem "element-name" {:key1 "value1", :key2 "value2"})) 
; => #'user/test-elem 

,因此值回來而沒有任何屬性:

test-elem 
; => #<FElem <element-name/>> 

但添加屬性的工作,否則。

(.add test-elem 
     (org.basex.query.item.FAttr. 
     (org.basex.query.item.QNm. "foo") 
     (org.basex.util.Token/token "bar"))) 
; => #<FElem <element-name foo="bar"/>> 

因此,大概我正在做循環的問題。任何指針?

回答

6

for在clojure中不是一個循環結構,而是一個列表理解併產生一個懶惰序列。

使用doseq代替意圖時的副作用。

+0

「產生一個懶惰的序列」...在那裏的文檔(http://clojuredocs.org/clojure_core/clojure.core/for),我沒有看到它。謝謝! – 2012-04-12 23:44:23