2016-08-22 56 views
0

我用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) 爲什麼clojure的地圖println只能在repl中使用?

但是如果我添加(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!

回答

9

map是懶惰的。引用的文件的第一個句子(強調):

返回懶惰序列由將f應用到 組的每個COLL的第一項目,接着將f應用到該組的結果的每個COL中的第二項,直到任何一個colls耗盡。

REPL強制對錶達式進行評估以顯示結果,但代碼中沒有任何內容。 可以解決這個問題,但你應該看看doseq/doall

5

如果你的目標是運行在一個單一的集合中的每個項目一個程序,你應該使用run!

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

在那裏的行動,你需要在每個集合執行情況相當複雜,簡單地應用現有的功能,doseq可能會更方便,但run!是一個更好的選擇。

相關問題