Qual è la differenza tra def e defonce in Clojure?Qual è la differenza tra def e defonce in Clojure?
Quando utilizzare def su defonce o viceversa?
Qual è la differenza tra def e defonce in Clojure?Qual è la differenza tra def e defonce in Clojure?
Quando utilizzare def su defonce o viceversa?
defonce
viene saltato quando la variabile è già definita.
user> (def a 1) ;;=> #'user/a
user> a ;;=> 1
user> (def a 2) ;;=> #'user/a
user> a ;;=> 2
user> (defonce b 1) ;;=> #'user/b
user> b ;;=> 1
user> (defonce b 2) ;;=> nil
user> b ;;=> 1
Defonce associa solo il nome al valore radice se il nome non ha valore radice.
Ad esempio, come ad esempio Jay Fields blogs, può essere utilizzato in congiunzione quando si desidera ricaricare gli spazi dei nomi ma potrebbe non essere necessario ricaricare tutto.
(defonce ignored-namespaces (atom #{}))
(defn reload-all []
(doseq [n (remove (comp @ignored-namespaces ns-name) (all-ns))]
(require (ns-name n) :reload)))