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

Fu8*_*u86 2 clojure

如果我理解文档正确,我可以这样写:

(let [a 5 b 10]
  (print a)
  (print b))
Run Code Online (Sandbox Code Playgroud)

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

(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)))))
Run Code Online (Sandbox Code Playgroud)

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

Max*_*oel 8

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

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

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