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

时间:2016-08-22 03:25:05

标签: clojure

我使用lein new app test-println创建一个clojure应用并使用lein repl启动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]))

lean run仅打印Hello, World!

2 个答案:

答案 0 :(得分:9)

map很懒。引用文档的第一句(增加重点):

  

返回延迟序列,其中包含将f应用于的结果   每个coll的第一项的集合,然后将f应用于该集合   每个coll中的第二项,直到任何一个colls都用完为止。

REPL强制评估表达式以显示结果,但代码中没有任何内容。 dorun可以解决此问题,但您可能应该改为doseq / doall

答案 1 :(得分:5)

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

(run! println [1 2 3 4 5 6])
;; 1
;; 2
;; 3
;; 4
;; 5
;; 6
;;=> nil

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