首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"For“失败,但"loop”有效

"For“失败,但"loop”有效
EN

Stack Overflow用户
提问于 2013-07-08 17:03:43
回答 2查看 98关注 0票数 3

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

代码语言:javascript
复制
(let [sqls (-> (slurp "resources/database.sql")
              (str/split #";")
              butlast)]
  (for [sql sqls]
      (k/exec-raw sql)))

但由于未知的原因,这不起作用。for循环被完全跳过。然而,这是可行的:

代码语言:javascript
复制
(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循环失败?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-08 18:37:26

for创建了一个惰性序列。只有当您以某种方式实际使用延迟序列的每个元素时,Clojure才会执行它。如果您只需要副作用,那么您应该使用dorun强制执行惰性序列。

在您的情况下,我建议您使用map

代码语言:javascript
复制
(->> (str/split (slurp "resources/database.sql")
                #";")
     butlast
     (map k/exec-raw)
     dorun)

或者doseq (see mtyaka's answer)而不是for循环

代码语言:javascript
复制
(doseq [sql (-> (slurp "resources/database.sql")
                (str/split #";")
                butlast)]
  (k/exec-raw sql))

我更喜欢map版本,但是doseq的运行速度要快一点。

票数 4
EN

Stack Overflow用户

发布于 2013-07-08 17:07:52

for很懒。请改用doseq

代码语言:javascript
复制
(doseq [sql sqls]
  (k/exec-raw sql))
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17522682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档