Clojure “loop won”的“let”inside“中的stations';我不能同时跑
我正在尝试使用clojure和neocons库将数据从StackOverflow导入Neo4j。请原谅我是个新手 以下是我在莱宁根的主要职能:Clojure “loop won”的“let”inside“中的stations';我不能同时跑,clojure,neo4j,Clojure,Neo4j,我正在尝试使用clojure和neocons库将数据从StackOverflow导入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")
(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)
)
)
)
)
我已经定义了导入问题
和导入答案
函数,这些函数可以独立工作。事实上,奇怪的是,我可以删除那些import-*
行中的任何一行,而另一行可以正常工作
有人能看出我做的简单的事情是不是错了吗?map和
for
都是懒惰的,除非你使用它们的结果,否则它们什么都不会做
第一个map
调用最终是一个noop,因为任何东西都无法使用它的输出。尝试为包装,并至少包装对dorun
的调用中的第一个map调用,或者如果您计划使用结果,则包装doall
此外,您还可以将
的替换为doseq
,除了它返回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)))))
map
和for
都是懒惰的,除非您使用它们的结果,否则它们什么都不会做
第一个map
调用最终是一个noop,因为任何东西都无法使用它的输出。尝试为
包装,并至少包装对dorun
的调用中的第一个map调用,或者如果您计划使用结果,则包装doall
此外,您还可以将
的替换为doseq
,除了它返回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)))))
你的具体问题不是重复的,但答案肯定是重复的。map
和for
都是懒惰的,除非您使用它们的结果,否则它们什么都不会做。第一个map
调用最终是一个noop,因为任何东西都无法使用它的输出。尝试将包装为
,至少将第一个映射
调用包装为对dorun
的调用。啊,太好了,当然就是这样。谢谢懒惰的虫子不时地咬我们所有人(至少是我)。附言:@noisesmith足够长的时间来输入答案。对不同问题的重复回答没有什么错。如果有一个公认的答案,它将帮助那些从搜索中走到这里的人。好的,谢谢。那就回答吧。@noisesmith你应该提到doseq
,这才是OP真正想要的。只知道副作用的顺序是不好的风格。你的具体问题不是重复的,但答案肯定是重复的。map
和for
都是懒惰的,除非您使用它们的结果,否则它们什么都不会做。第一个map
调用最终是一个noop,因为任何东西都无法使用它的输出。尝试将包装为
,至少将第一个映射
调用包装为对dorun
的调用。啊,太好了,当然就是这样。谢谢懒惰的虫子不时地咬我们所有人(至少是我)。附言:@noisesmith足够长的时间来输入答案。对不同问题的重复回答没有什么错。如果有一个公认的答案,它将帮助那些从搜索中走到这里的人。好的,谢谢。那就回答吧。@noisesmith你应该提到doseq
,这才是OP真正想要的。只实现副作用序列是一种糟糕的风格。太棒了,谢谢!即使它是复制品,拥有它也绝对不错。我搜索了很多,但找不到任何答案,因此我们正在为有此问题的用户增加登录空间,我想这太棒了,谢谢!即使它是复制品,拥有它也绝对不错。我搜索了很多,找不到任何答案,所以我想我们正在为有这个问题的用户增加登陆空间