Leiningen Uberjar 与 lein run 的结果不同

Kob*_*son 3 clojure leiningen

当我在 clojure repl 中运行它或使用 leiningen repl 时,我的应用程序会运行,但是当我使用 uberjar 创建一个 jar 并运行该应用程序时,它只读取我的集合的前 2 条记录。

我追踪到 pmap,所以我创建了 pmap 的最简单的用法,它变得更奇怪。为什么这有效

(ns ktest.core
    (:gen-class))
(defn -main []
  (println (pmap identity (range 20))))
Run Code Online (Sandbox Code Playgroud)

但不是这个

(ns ktest.core
        (:gen-class))
    (defn -main []
       (pmap #(println %) (range 20)))
Run Code Online (Sandbox Code Playgroud)

Art*_*ldt 5

你被“懒虫”咬了。pmap 创建序列,读取时将计算结果。当您使用它运行它时,println它会读取结果,以便可以打印它们,从而触发评估。在这种情况下,您可以修复此问题doalldorun。如果您只需要运行它的打印副作用,则选择dorun,如果您需要对此结果执行某些操作,则选择doall将结果保留在内存中。

(dorun (pmap #(println %) (range 20)))
Run Code Online (Sandbox Code Playgroud)

由于分块序列,一些项目被打印。有关pmap 和分块序列的详细信息,请参阅此 Jira 问题。