2012-04-12 8 views
1

ClojureのBaseXの内部データ型を使用してXML構造を構築しようとしています。clojure:forループの内容が呼び出されない

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

をこうして値は、任意の属性なしで戻ってくる:要素を作成するために泣き、これを使用して

(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)) 

は、 "THISに到達する" 印刷されることはありません

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

"遅れたシーケンスを生成する"というのは、docs(http://clojuredocs.org/clojure_core/clojure.core/for)にあります。私はそれを見ません。ありがとう! –

関連する問題