Clojure &引用;至于;失败,但;“循环”;作品
我想使用SQLKorma执行一些SQL语句。首先,我编写了以下代码:Clojure &引用;至于;失败,但;“循环”;作品,clojure,Clojure,我想使用SQLKorma执行一些SQL语句。首先,我编写了以下代码: (let [sqls (-> (slurp "resources/database.sql") (str/split #";") butlast)] (for [sql sqls] (k/exec-raw sql))) 但由于未知的原因,这是行不通的。for循环被完全跳过。然而,这是可行的: (let [sqls (-> (slurp "re
(let [sqls (-> (slurp "resources/database.sql")
(str/split #";")
butlast)]
(for [sql sqls]
(k/exec-raw sql)))
但由于未知的原因,这是行不通的。for循环被完全跳过。然而,这是可行的:
(let [sqls (-> (slurp "resources/database.sql")
(str/split #";")
butlast)]
(loop [sqls sqls]
(if (not (empty? sqls))
(do
(k/exec-raw (first sqls))
(recur (rest sqls))))))
为什么会发生这种情况?为什么for循环失败?
for
是惰性的。改用doseq
:
(doseq [sql sqls]
(k/exec-raw sql))
for
创建一个惰性序列。Clojure只在您实际以某种方式使用惰性序列时才执行该序列的每个元素。如果您只需要副作用,那么应该使用强制执行惰性序列
在您的情况下,我建议您使用map
(->> (str/split (slurp "resources/database.sql")
#";")
butlast
(map k/exec-raw)
dorun)
或doseq
(),而不是for
循环
(doseq [sql (-> (slurp "resources/database.sql")
(str/split #";")
butlast)]
(k/exec-raw sql))
我更喜欢
map
version,但是doseq
的工作速度要快一点;mapv不是懒散的是,这就是为什么我的例子中有一个dorun
。我根据mtyaka的答案添加了doseq
例子。在Clojure中,for
不是循环,而是列表理解。别让这个名字骗了你。