Clojure的观看功能执行,而是“地图”作为功能部不执行
问题描述:
(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似乎有任何影响。
任何帮助,将不胜感激, 谢谢!
答
map
函数是懒惰的,所以只有当调用者实现了它产生的序列(当函数作为手表的一部分被调用时,因为结果基本被抛弃),它才会工作。
你要么想要包装doall
的map
呼叫,或使用doseq
,而不是(这是更地道的副作用的代码):
(doseq [subscriber (:subscribers new-state)]
(replace-canvas (:canvas new-state) subscriber))
还要注意(:canvas new-state)
比(new-state :canvas)
更地道 - 首先关键字。