私は、1つのクローズ・ネームスペース内のオブジェクトを作成して破棄し、別のネームスペースをコーディネイトする必要があるという状況があります。しかし、私は最初の名前空間がオブジェクトの破棄時に2番目の名前空間を明示的に呼び出さなければならないことは望ましくありません。Clojureでフックを行う方法
Javaでは、リスナーを使用できます。残念ながら、基礎となるJavaライブラリは、オブジェクトの破棄時にイベントを通知しません。私がEmacs-Lispにいたら、そのトリックを行うフックを使います。
今、私は確信していません。私はRobert Hookeのライブラリhttps://github.com/technomancy/robert-hookeを見つけました。しかし、これはelispの点では欠点に似ています - 私は関数を構成しています。ドキュメントの詳細:
"フックはあなたが制御しない機能を拡張することを意図しています;もしあなたが目的の機能を所有していれば、明らかにその動作を変更する良い方法があります。
悲しいことに、私はそれがとてもわかりません。
もう1つの可能性は、add-watchを使用することですが、これはアルファとしてマークされています。
別の明白な解決策がありませんか?
例を追加しました:
だから、まず名前空間....
(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は別のものを必要とし、明示しなければならないことです削除イベントをプッシュします。これはちょっと大変ですが、 "もう一つの"名前空間があっても聞きたかったらうまくいきません。
私は最初の機能をフックすることを考えました。
HMMの
おかげで、用語 "破壊" について注意してください。オブジェクトの破壊は、GCがクリーンアップするときにのみ起こると私は信じています。オブジェクトを削除することは、オブジェクトを削除することとは異なりますが、オブジェクトを削除することもできます。 –