Clojure - Vigilantes
Watcherssão funções adicionadas a tipos de variáveis, como átomos e variáveis de referência, que são chamadas quando um valor do tipo de variável muda. Por exemplo, se o programa de chamada alterar o valor de uma variável atom e se uma função de observador for anexada à variável atom, a função será chamada assim que o valor do átomo for alterado.
As funções a seguir estão disponíveis no Clojure for Watchers.
adicionar relógio
Adiciona uma função de observação a uma referência de agente / átomo / var / ref. O relógio‘fn’deve ser um 'fn' de 4 args: uma chave, a referência, seu estado antigo, seu estado novo. Sempre que o estado da referência pode ter sido alterado, quaisquer relógios registrados terão suas funções chamadas.
Sintaxe
A seguir está a sintaxe.
(add-watch variable :watcher
(fn [key variable-type old-state new-state]))
Parameters- 'variável' é o nome do átomo ou variável de referência. 'tipo de variável' é o tipo de variável, seja átomo ou variável de referência. 'old-state e new-state' são parâmetros que manterão automaticamente o valor antigo e o novo da variável. 'key' deve ser única por referência e pode ser usada para remover o relógio com remove-watch.
Return Value - Nenhum.
Exemplo
Um exemplo de como isso é usado é mostrado no programa a seguir.
(ns clojure.examples.example
(:gen-class))
(defn Example []
(def x (atom 0))
(add-watch x :watcher
(fn [key atom old-state new-state]
(println "The value of the atom has been changed")
(println "old-state" old-state)
(println "new-state" new-state)))
(reset! x 2))
(Example)
Resultado
O programa acima produz a seguinte saída.
The value of the atom has been changed
old-state 0
new-state 2
remover-assistir
Remove um relógio que foi anexado a uma variável de referência.
Sintaxe
A seguir está a sintaxe.
(remove-watch variable watchname)
Parameters- 'variável' é o nome do átomo ou variável de referência. 'watchname' é o nome dado ao relógio quando a função de relógio é definida.
Return Value - Nenhum.
Exemplo
Um exemplo de como isso é usado é mostrado no programa a seguir.
(ns clojure.examples.example
(:gen-class))
(defn Example []
(def x (atom 0))
(add-watch x :watcher
(fn [key atom old-state new-state]
(println "The value of the atom has been changed")
(println "old-state" old-state)
(println "new-state" new-state)))
(reset! x 2)
(remove-watch x :watcher)
(reset! x 4))
(Example)
Resultado
O programa acima produz a seguinte saída.
The value of the atom has been changed
old-state 0
new-state 2
Você pode ver claramente no programa acima que o segundo comando de reinicialização não aciona o observador, pois foi removido da lista do observador.