La documentazione dà la risposta:
=> (doc declare)
-------------------------
clojure.core/declare
([& names])
Macro
defs the supplied var names with no bindings, useful for making forward declarations.
Looking at the implementation, è chiaro che declare
è definito in termini di def
e fornisce un po 'di zucchero di sintassi. Quindi, funzionalmente, sono praticamente la stessa cosa.
Il vantaggio di declare
è mostrare l'intento di un lettore successivo. (declare x y z)
significa che ho intenzione di fare una dichiarazione anticipata di quei simboli, perché la macro è useful for making forward declarations.
(def x) (def y) (def z)
significa che sono internato questi simboli, ma non so se volevo dare loro definizioni e dimenticato di o se io sto facendo dichiarazioni in avanti, o forse qualcos'altro di sottile.
Quindi, (def x)
deve essere preferito a (def x)
quando si effettua una dichiarazione anticipata, per mostrare pietà ai futuri lettori del proprio codice.