2014-12-02 74 views
2
(defonce instance 
    (atom 
    {:id nil 
    :canvas nil 
    :subscribers #{"test1" "test2"})) 

(defn replace-canvas [canvas id] 
    (println "replaced" id "'s canvas")) 

(defn update-subscribers 
    [k r old-state new-state] 
    (pprint "this function is being called") 
    (pprint "I can execute consecutive forms") 
    (map (partial replace-canvas (new-state :canvas)) 
     (new-state :subscribers))) 

(add-watch instance :update-subs update-subscribers) 

當實例原子變化,手錶功能表面上被調用,因爲「這個函數是被稱爲」和「我可以執行連續的形式」是都是印刷的,但地圖功能似乎從未發生過。我不確定爲什麼會出現這種情況,而且在add-watch的文檔中找不到任何可以放在watch函數內部的限制。Clojure的觀看功能執行,而是「地圖」作爲功能部不執行

即使我更換更新,用戶在地圖的東西更直接的像

(map println (new-state :subscribers)) 

地圖doen't似乎有任何影響。

任何幫助,將不勝感激, 謝謝!

回答

4

map函數是懶惰的,所以只有當調用者實現了它產生的序列(當函數作爲手錶的一部分被調用時,因爲結果基本被拋棄),它纔會工作。

你要麼想要包裝doallmap呼叫,或使用doseq,而不是(這是更地道的副作用的代碼):

(doseq [subscriber (:subscribers new-state)] 
    (replace-canvas (:canvas new-state) subscriber)) 

還要注意(:canvas new-state)(new-state :canvas)更地道 - 首先關鍵字。