`for` 循环内的 `let` 内的语句不会同时 运行

Statments inside `let` inside `for` loop won't both run at the same time

我正在尝试使用 clojure 和 neocons 库将数据从 Whosebug 导入到 Neo4j。原谅我有点菜鸟。

这是我在莱宁根的主要功能:

(defn -main
  [& args]

  (let [neo4j-conn  (nr/connect "http://localhost:7777/db/data/")]

    (cypher/tquery neo4j-conn "MATCH n OPTIONAL MATCH n-[r]-() DELETE n, r")

    (for [page (range 1 6)]
      (let [data (parse-string (Whosebug-get-questions page))
            questions (data "items")
            has-more (data "has_more")
            question-ids (map #(%1 "question_id") questions)
            answers ((parse-string (Whosebug-get-answers question-ids)) "items")]
        (map #(import-question %1 neo4j-conn) questions)
        (map #(import-answer %1 neo4j-conn) answers)
      )
    )
  )
)

我已经定义了 import-questionimport-answer 函数,它们可以独立工作。事实上,奇怪的是我可以删除这些 import-* 行中的任何一行,而另一行将正常工作。

谁能看出我做的简单的事情是不是错了?

mapfor 都是懒惰的,除非你消费他们的结果,否则什么都不做。

第一个 map 调用最终成为一个 noop,因为任何东西都无法使用它的输出。尝试将 for 和至少第一个映射调用包装在对 dorundoall 的调用中,如果您计划使用结果。

此外,您可以将 for 替换为 doseq,除了 returns nil,急切地消耗其输入,并且可以在其主体中包含多种形式之外,它是相同的。

使用 doseq:

您的代码可能如下所示
(defn -main
  [& args]
  (let [neo4j-conn (nr/connect "http://localhost:7777/db/data/")]
    (cypher/tquery neo4j-conn "MATCH n OPTIONAL MATCH n-[r]-() DELETE n, r")
    (doseq [page (range 1 6)
            :let [data (parse-string (Whosebug-get-questions page))
                  questions (data "items")
                  has-more (data "has_more")
                  question-ids (map #(%1 "question_id") questions)
                  answers ((parse-string (Whosebug-get-answers question-ids)) "items")]]
      (doseq [q questions]
        (import-question q neo4j-conn))
      (doseq [a answers]
        (import-answer a neo4j-conn)))))