我有一种情况,我在一个 clojure 命名空间中创建和销毁对象,并希望另一个命名空间进行协调。但是,我不希望第一个命名空间必须在对象销毁时显式调用第二个命名空间。
在 Java 中,我可以使用监听器。不幸的是,底层的 java 库不会在对象销毁时发出事件信号。如果我在 Emacs-Lisp 中,那么我会使用钩子来解决问题。
现在,在clojure中我不太确定。我找到了 Robert Hooke 库https://github.com/technomancy/robert-hook。但这更像是 elisp 术语中的 defadvice——我正在编写函数。更多的文档说:
“钩子旨在扩展您无法控制的功能;如果您拥有目标功能,显然有更好的方法来改变它的行为。”
可悲的是,我发现它并不那么明显。
另一种可能性是使用 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 必须要求另一个并明确地推送删除事件。这有点笨拙,但如果我有“又一个”命名空间,它也想听,也不起作用。
因此,我想到了挂钩第一个功能。