我有一个情况,我正在创建和销毁对象在一个Clojure命名空间中,并希望另一个命名空间进行协调。但是,我不想让第一个命名空间在对象销毁时显式地调用第二个命名空间。
在Java中,我可以使用监听器。不幸的是,底层的Java库没有在对象销毁时发出事件信号。如果我在Emacs-Lisp中,那么我会使用钩子来完成这个任务。
现在,在Clojure中我不太确定。我找到了Robert Hooke库https://github.com/technomancy/robert-hooke。但这更像是elisp术语中的defadvice,我正在组合函数。而且文档说:
“Hooks旨在扩展您无法控制的函数;如果您拥有目标函数,显然有更好的方法来更改其行为。”
不幸的是,我没有发现其他明显的解决方案。
另一个可能性是使用add-watch,但这被标记为alpha版本。
我是否漏掉了其他明显的解决方案?
添加示例:
所以第一个命名空间...
这里的问题在于scratch-clj.first必须要求另一个命名空间,并明确推送删除事件。这有点笨拙,而且如果我有“yet-another”命名空间也想监听,则无法工作。
因此,我考虑挂钩第一个函数。
在Java中,我可以使用监听器。不幸的是,底层的Java库没有在对象销毁时发出事件信号。如果我在Emacs-Lisp中,那么我会使用钩子来完成这个任务。
现在,在Clojure中我不太确定。我找到了Robert Hooke库https://github.com/technomancy/robert-hooke。但这更像是elisp术语中的defadvice,我正在组合函数。而且文档说:
“Hooks旨在扩展您无法控制的函数;如果您拥有目标函数,显然有更好的方法来更改其行为。”
不幸的是,我没有发现其他明显的解决方案。
另一个可能性是使用add-watch,但这被标记为alpha版本。
我是否漏掉了其他明显的解决方案?
添加示例:
所以第一个命名空间...
(ns scratch-clj.first
(:require [scratch-clj.another]))
(def listf (ref ()))
(defn add-object []
(dosync
(ref-set listf (conj
@listf (Object.))))
(println listf))
(defn remove-object []
(scratch-clj.another/do-something-useful (first @listf))
(dosync
(ref-set listf (rest @listf)))
(println listf))
(add-object)
(remove-object)
第二个命名空间
(ns scratch-clj.another)
(defn do-something-useful [object]
(println "object removed is:" object))
这里的问题在于scratch-clj.first必须要求另一个命名空间,并明确推送删除事件。这有点笨拙,而且如果我有“yet-another”命名空间也想监听,则无法工作。
因此,我考虑挂钩第一个函数。