2011-02-28 62 views
6

根據Mark的令人敬畏的教程頁面,「map函數應用給定的函數,該函數將一個參數傳遞給集合中的每個項目,並返回一個懶惰的結果序列」。clojure地圖功能是否渴望?

然而,當我做到以下幾點:

(def input-message-list (range 100 126)) 

(defn test-123 [in] 
    (println "doing " in) 
    (str "out " in)) 

(def output-test (map 
        test-123 
        input-message-list)) 

(first output-test) 

,在REPL我得到的println副作用,品種齊全,不僅是第一要素!

這裏發生了什麼事?

回答

7

已經回答了在here

如真的有32種元素的同時

你的範圍內具有小於32組的元素進行評估。

3

這是分塊序列的一部分,它確實有助於在Clojure中無處不在的「map over lazy seq」模式的性能。這樣你的映射函數就可以獲得更多的連續調用,並且使它快速進入JVM熱點編譯器的快速路徑。當富在2008年演示了這個在舊金山這是令人驚訝地看到代碼運行的這兩個塊以相同的速度:

(reduce + (map inc (range 10000))) 

(loop [i 0 sum 0] 
    (recur (inc i) (+ sum i))) 

現在你可以寫idomatic Clojure的,並得到全速。如果它成爲問題,那麼你可以關閉它here