`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-question
和 import-answer
函数,它们可以独立工作。事实上,奇怪的是我可以删除这些 import-*
行中的任何一行,而另一行将正常工作。
谁能看出我做的简单的事情是不是错了?
map
和 for
都是懒惰的,除非你消费他们的结果,否则什么都不做。
第一个 map
调用最终成为一个 noop,因为任何东西都无法使用它的输出。尝试将 for
和至少第一个映射调用包装在对 dorun
或 doall
的调用中,如果您计划使用结果。
此外,您可以将 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)))))
我正在尝试使用 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-question
和 import-answer
函数,它们可以独立工作。事实上,奇怪的是我可以删除这些 import-*
行中的任何一行,而另一行将正常工作。
谁能看出我做的简单的事情是不是错了?
map
和 for
都是懒惰的,除非你消费他们的结果,否则什么都不做。
第一个 map
调用最终成为一个 noop,因为任何东西都无法使用它的输出。尝试将 for
和至少第一个映射调用包装在对 dorun
或 doall
的调用中,如果您计划使用结果。
此外,您可以将 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)))))