Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure &引用;至于;失败,但;“循环”;作品_Clojure - Fatal编程技术网

Clojure &引用;至于;失败,但;“循环”;作品

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

我想使用SQLKorma执行一些SQL语句。首先,我编写了以下代码:

(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
不是循环,而是列表理解。别让这个名字骗了你。