为什么clojure的地图println只能用于repl?

Zep*_*lee 0 clojure

lein new app test-println用来创建一个clojure应用程序并启动repl lein repl,然后我输入(map println [1 2 3 4 5 6])并获得预期的结果: test-println.core=> (map println [1 2 3 4 5 6]) 1 2 3 4 5 6 (nil nil nil nil nil nil)

但是,如果我添加(map println [1 2 3 4 5 6])到结尾src/test_println/core.clj:

(ns test-println.core
  (:gen-class))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (println "Hello, World!")
  (map println [1 2 3 4 5 6]))
Run Code Online (Sandbox Code Playgroud)

lean run仅打印Hello, World!.

Mic*_*ohl 9

地图很懒.引用文档的第一句话(重点补充):

返回一个惰性序列,包括将f应用于每个coll的第一项集合的结果,然后将f应用于每个coll中的第二项集合,直到任何一个colls都用完为止.

REPL强制评估表达式以显示结果,但代码中没有任何内容.dorun会解决这个问题,但你可能应该看看doseq/doall.


Sam*_*tep 5

如果您的目标是对单个集合中的每个项目运行单个过程,则应使用run!:

(run! println [1 2 3 4 5 6])
;; 1
;; 2
;; 3
;; 4
;; 5
;; 6
;;=> nil
Run Code Online (Sandbox Code Playgroud)

如果您需要对每个集合执行的操作比仅应用现有函数更复杂,doseq可能更方便,但run!这里是更好的选择.