[英]Clojure constantly and map function
為什么這樣的Clojure代碼:
user=> (map (constantly (println "Loop it.")) (range 0 3))
產生以下輸出:
Loop it.
(nil nil nil)
我希望它可以打印三遍“ Loop it”,這是對該函數進行三遍評估的副作用。
constantly
不會多次評估其參數。 它是一個函數,而不是宏,因此該參數在constantly
運行之前僅被評估一次。 constantly
做的就是獲取其(求值的)參數並返回一個函數,該函數每次調用時都返回給定值(無需重新求值,因為正如我所說,自變量在constantly
運行之前就已經被求值了)。
如果您要做的只是為范圍內的每個元素調用(println "Loop it")
,則應將其作為要映射的函數傳遞,而不是constantly
。 請注意,您實際上必須將其作為函數而不是經過評估的表達式傳遞。
通過反復使用usig和lambda表達式,您可以獲得接近您意圖的行為。
例如:
(repeatedly 3 #(println "Loop it"))
除非您在REPL上,否則它必須被dorun
或類似的dorun
包圍。 repeatedly
是懶惰。
正如sepp2k正確地constantly
指出的是一個函數,因此其參數將僅被評估一次。
實現此處操作的慣用方式是使用doseq
:
(doseq [i (range 0 3)]
(println "Loop it."))
或者使用dotimes
(在這種情況下,它更加簡潔高效,因為您實際上並沒有使用range
產生的序列):
(dotimes [i 3]
(println "Loop it."))
這兩種解決方案都是非惰性的,如果您只是運行一些副作用代碼,那么這可能就是您想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.