如果我理解文档正确,我可以这样写:
(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不是.我监督一些事情吗?我出于想法,这里出错了:(
问题不在于你的想法:Clojure for使用了懒惰的评估 - 也就是说,如果你不对它返回的内容做任何事情,那么循环永远不会运行.
这对于你甚至不需要完整的大规模序列的长时间运行循环非常有用,但是当你真正尝试运行副作用时,你需要远离懒惰的评估.
您想要使用doseq(http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/doseq).
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |