2012-10-09 10 views
7

Guardando clojure.testsource code, ho notato quanto segue:A cosa serve ^: dinamico su un defonce?

(defonce ^:dynamic 
    ^{:doc "True by default. If set to false, no test functions will 
    be created by deftest, set-test, or with-test. Use this to omit 
    tests when compiling or loading production code." 
    :added "1.1"} 
    *load-tests* true) 

C'è qualche beneficio o ragione dietro la prevenzione ridefinizione (vale a dire utilizzando defonce) di un var, che è contrassegnato come ^:dynamic?

+0

Potrebbe essere per impedire a un avvertimento dal compilatore di avere una variabile non dinamica chiamata '* qualcosa *'? – thoferon

+0

Quindi la domanda sarebbe: perché usare i paraorecchie sul nome, che sta esprimendo esattamente lo stesso significato di '^: dynamic' nelle vecchie versioni di Clojure. Controllerò se le versioni precedenti di 'clojure.test' stanno usando differenti strategie' def' per quella var. – skuro

risposta

4

defonce non impedisce la ridefinizione in generale, ma solo quando si ricarica il file. Questo è utile in genere quando var sta mantenendo una sorta di stato o contesto. Credo che l'uso di defonce qui, potrebbe essere un artefatto dallo sviluppo della libreria, in cui lo sviluppatore ha bisogno di ricaricare il file molte volte durante lo sviluppo pur continuando a mantenere lo stesso valore.

Poiché la variabile non punta a un riferimento, ma una variabile diretta, utilizzare ^:dynamic è la scelta giusta. Ora il codice può utilizzare set! o binding per modificare il valore in un thread locale.