当我在clojure repl或使用leiningen repl中运行它时,我的应用程序将运行,但是当我使用uberjar创建一个jar并运行该应用程序时,它仅读取集合的前2条记录。
我将其跟踪到pmap,因此我创建了pmap的最简单的用法,但它变得更加奇怪。
为什么这项工作
(ns ktest.core
(:gen-class))
(defn -main []
(println (pmap identity (range 20))))
但不是这个
(ns ktest.core
(:gen-class))
(defn -main []
(pmap #(println %) (range 20)))
最佳答案
您被“懒虫”咬伤了。 pmap创建一个序列,该序列在读取时将计算结果。当您使用println
运行此命令时,它将读取结果,以便可以打印结果,从而触发评估。在这种情况下,您可以将其修复为doall
或dorun
。如果只需要运行它的打印副作用,则选择dorun
,如果需要对结果进行某些操作,则选择doall
,将结果保存在内存中。
(dorun (pmap #(println %) (range 20)))
由于chunked sequences,一些项目被打印。有关pmap and chunked sequences的详细信息,请参见此Jira问题。