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

Bri*_*ood 0 clojure neo4j

我正在尝试使用clojure和neocons库将数据从StackOverflow导入Neo4j.请原谅我是一个新手.

这是我在Leiningen的主要功能:

(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 (stackoverflow-get-questions page))
            questions (data "items")
            has-more (data "has_more")
            question-ids (map #(%1 "question_id") questions)
            answers ((parse-string (stackoverflow-get-answers question-ids)) "items")]
        (map #(import-question %1 neo4j-conn) questions)
        (map #(import-answer %1 neo4j-conn) answers)
      )
    )
  )
)
Run Code Online (Sandbox Code Playgroud)

我已经定义import-questionimport-answer功能,这些工作独立.事实上,奇怪的是我可以删除其中任何一条import-*线,而另一条线条可以正常工作.

任何人都可以看到我做的事情是不是很简单?

noi*_*ith 5

这两个mapfor懒惰,除非你消耗他们的结果会什么都不做.

第一个map调用最终成为一个noop,因为没有办法消耗它的输出.尝试for在调用中包装和至少第一个地图调用dorun,或者doall如果您计划使用结果.

此外,您可以替换fordoseq,除了返回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 (stackoverflow-get-questions page))
                  questions (data "items")
                  has-more (data "has_more")
                  question-ids (map #(%1 "question_id") questions)
                  answers ((parse-string (stackoverflow-get-answers question-ids)) "items")]]
      (doseq [q questions]
        (import-question q neo4j-conn))
      (doseq [a answers]
        (import-answer a neo4j-conn)))))
Run Code Online (Sandbox Code Playgroud)