Ho una situazione in cui creo e distruggo oggetti in uno spazio dei nomi clojure e voglio che un altro spazio dei nomi sia coordinato. Comunque non voglio che il primo namespace debba chiamare il secondo esplicitamente sulla distruzione dell'oggetto.Come agganciare in Clojure
In Java, potrei usare un listener. Sfortunatamente le librerie java sottostanti non segnalano eventi sulla distruzione degli oggetti. Se fossi in Emacs-Lisp, allora userei i ganci che fanno il trucco.
Ora, in clojure non ne sono così sicuro. Ho trovato la biblioteca di Robert Hooke https://github.com/technomancy/robert-hooke. Ma questo è più come defadvice in termini elis: sto componendo funzioni. Più oltre la documentazione dice:
"I ganci sono pensati per estendere le funzioni che non controlli, se possiedi la funzione obiettivo ci sono ovviamente modi migliori per cambiare il suo comportamento."
Purtroppo non lo trovo così ovvio.
Un'altra possibilità sarebbe utilizzare add-watch, ma questo è contrassegnato come alfa.
Mi manca un'altra soluzione ovvia?
Esempio Aggiunto:
Quindi, prima dello spazio dei nomi ....
(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)
Seconda namespace
(ns scratch-clj.another)
(defn do-something-useful [object]
(println "object removed is:" object))
Il problema qui è che graffi clj.first deve richiedere un'altra ed esplicitamente spingere gli eventi di rimozione attraverso. Questo è un po 'goffo, ma non funziona anche se avessi uno spazio dei nomi "ancora-un altro", che voleva anche ascoltare.
Quindi ho pensato di agganciare la prima funzione.
Hmm, fare attenzione circa il termine "distruzione". Credo che la distruzione degli oggetti avvenga solo quando il GC si ripulisce. La rimozione di oggetti è diversa dalla distruzione di oggetti, sebbene uno possa causare l'altro. –