2014-01-11 62 views
1

對第一人稱問好的工作很好,爲什麼不說 - 你好對大家?如何在矢量上執行帶有副作用的功能?

 
(defpartial greeting [name] 
    [:p.alert "Hello " name ", how are you?"]) 

(defn say-hello [name] 
    (append $content (greeting name))) 

(defn say-hello-to-first-person [names] 
    (say-hello (first names))) 

(defn say-hello-to-everyone [names] 
    (map say-hello names)) 

(say-hello-to-first-person ["Chris" "Tom" "Jim" "Rocky"]) 
(say-hello-to-everyone ["Chris" "Tom" "Jim" "Rocky"]) 
+1

請參閱'doall'和'dorun'函數。 'doseq'也許是你想要的。 – edbond

回答

3

你想doseq,Clojure的「的foreach」:

(doseq [name names] 
    (say-hello name)) 

map沒有按不起作用,因爲它會產生一個懶惰的序列:直到你實際訪問序列中的項目(你不在這裏),它們都不會被評估,副作用也不會發生。

另一種選擇是通過圍繞map圍繞dorun進行強制評估。思考爲什麼這個作品可以幫助你理解(儘管doseq是這裏的慣用方法)。

2

由於@edbond在他的評論中說,地圖fn不會評估,直到必要的時刻,因爲地圖fn返回一個懶惰的seq。

這是map FN 返回由將f應用到 組的每個COLL的第一項目的結果的懶惰序列的文檔,接着將f應用到在每個COLL第二項目組 ,直到任何一個colls都是 用盡。其他colls中的任何剩餘項目都將被忽略。函數 f應該接受colls數量的參數。

如果您需要確保該值是評估在你的代碼中的一個特定部分,你可以使用doalldorun

+0

或(last(map side-effect-fn!) - 會導致lazy-seq被實現,雖然這不被認爲是好的做法,因爲它不能解釋它自己,實際上我甚至不知道爲什麼我' m煩躁地說這個;-) – Hendekagon