clojure:for循环内容未调用 [英] clojure: for loop contents not invoked

查看:71
本文介绍了clojure:for循环内容未调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Clojure的BaseX的内部数据类型来构建XML结构。

I'm trying to build an XML structure using the internal data types from BaseX from Clojure.

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

在使用此功能时哭泣地创建一个元素,从不打印已达到:

When using this to cry to create an element, "THIS IS REACHED" is never printed:

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

因此,值返回时没有任何属性:

And thus the value comes back without any attributes:

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"/>>

因此,想必我在循环中做错了。

Thus, presumably I'm doing something wrong with the loop. Any pointers?

推荐答案

for 并不是Clojure中的循环构造,

for is not a loop construct in clojure, rather it's a list comprehension and produces a lazy sequence.

在有副作用的情况下使用 doseq 代替。

Use doseq instead when side effects are intended.

这篇关于clojure:for循环内容未调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆