2014-12-02 85 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)更地道 - 首先关键字。