gpt4 book ai didi

clojure - let 不执行主体中的第二个表达式

转载 作者:行者123 更新时间:2023-12-02 16:46:18 26 4
gpt4 key购买 nike

如果我理解 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 。我有监督什么事情吗?我不知道这里出了什么问题:(

最佳答案

问题不是你想的那样:Clojure 的 for 使用惰性求值——也就是说,如果你不对它返回的内容做任何事情,循环就永远不会运行。

这对于在大量序列上长时间运行的循环非常有用,您甚至不需要完全使用它们,但是当您实际上尝试运行副作用时,您需要远离惰性评估。

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

关于clojure - let 不执行主体中的第二个表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21387021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com