我有一種情況,我在一個clojure命名空間中創建和銷燬對象,並且想要另一個名稱空間來協調。不過,我不希望第一個命名空間必須在對象銷燬上明確調用第二個命名空間。如何在Clojure中做鉤子
在Java中,我可以使用偵聽器。不幸的是,底層的java庫不會在對象銷燬時發出事件信號。如果我在Emacs-Lisp中,那麼我會使用鉤子來實現。
現在,在clojure我不太確定。我找到了Robert Hooke圖書館https://github.com/technomancy/robert-hooke。但是這更像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))
這裏的問題是,劃痕clj.first有需要再和明確推送移除事件。這有點笨重,但是如果我有另一個「另一個」命名空間,它也想工作,這也是行不通的。
因此,我想到了鉤住第一個功能。
嗯,要小心術語「破壞」。我相信物體的破壞只發生在GC清理之後。刪除對象與銷燬對象不同,但可能會導致另一個對象。 –