let不执行正文中的第二个表达式

时间:2014-01-27 17:05:37

标签: clojure

如果我理解documentation权利,我可以写下:

(let [a 5 b 10]
  (print a)
  (print b))

这按预期工作并打印出5和10.我在此代码段中使用此机制(如果您需要更多参考,则完整代码为here):

(defn create! [fields]
  (let [username (user/unique-user (:author fields))
        competition-id (:id (competition/latest))]
    (if-not (exists? (:ld_uid fields))
      (insert entries (values {
                               :ld_uid (:ld_uid fields)
                               :title (:title fields)
                               :description (:description fields)
                               :type (:type fields)
                               :user_id (:id username)
                               :competition_id competition-id})))
    (for [link (:links fields)]
      (source/create! (:id (by-ld-uid (:ld_uid fields))) (:url link) (:title link)))))

问题是,for表达式未执行。这些语句按预期工作但在insert表达式上面的代码中执行但for没有。我监督一些事情吗?我的想法在这里出错:(

1 个答案:

答案 0 :(得分:8)

问题不在于你的想法:Clojure的for使用延迟评估 - 也就是说,如果你不对它返回的内容做任何事情,那么循环永远不会运行。

这对于你甚至不需要完整的大规模序列的长期循环非常有用,但是当你真正尝试运行副作用时,你需要远离懒惰的评估。

您想要使用doseq代替http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/doseq)。