あるclojure名前空間でオブジェクトを作成および破棄していて、別の名前空間を調整したいという状況があります。ただし、オブジェクトの破棄時に最初の名前空間が2番目の名前空間を明示的に呼び出す必要はありません。
Javaでは、リスナーを使用できました。残念ながら、基盤となるJavaライブラリは、オブジェクトの破棄に関するイベントを通知しません。もし私がEmacs-Lispにいたら、私はそのトリックを行うフックを使うだろう。
さて、clojureではよくわかりません。RobertHookeライブラリhttps://github.com/technomancy/robert-hookeを見つけました。しかし、これはelisp用語でのdefadviceのようなものです-私は関数を作成しています。ドキュメントの詳細は次のように述べています。
「フックは、制御できない関数を拡張することを目的としています。ターゲット関数を所有している場合は、その動作を変更するためのより良い方法が明らかにあります。」
悲しいことに、私はそれがそれほど明白であるとは思っていません。
もう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)
2番目の名前空間
(ns scratch-clj.another)
(defn do-something-useful [object]
(println "object removed is:" object))
ここでの問題は、scratch-clj.firstが別のイベントを要求し、明示的に削除イベントをプッシュする必要があることです。これは少し不格好ですが、「まだ別の」名前空間があり、それも聞きたい場合は機能しません。
したがって、私は最初の関数をフックすることを考えました。