如果我理解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
没有。我监督一些事情吗?我的想法在这里出错:(
答案 0 :(得分:8)
问题不在于你的想法:Clojure的for
使用延迟评估 - 也就是说,如果你不对它返回的内容做任何事情,那么循环永远不会运行。
这对于你甚至不需要完整的大规模序列的长期循环非常有用,但是当你真正尝试运行副作用时,你需要远离懒惰的评估。
您想要使用doseq
代替http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/doseq)。