sto cercando di definire una macro per la definizione delle costanti in fase di compilazione della sintassi per i quali è stato aggiunto in Clojure 1.3:definizione costante in Clojure
== 2.14 ^: const defs ==
^: const consente di denominare i valori primitivi con un riferimento più rapido.
(DEF costanti {: pi 3.14: e 2.71})
(DEF ^: pi const (: costanti PI)) (def ^: const e (: e costanti))
L'overhead di cercare: e e: pi nella mappa avviene al momento della compilazione , come (: pi costanti) e (: e costanti) vengono valutati quando vengono valutati i relativi moduli parent defig .
Fondamentalmente voglio po 'di zucchero sintassi intorno (def ^:const ... ...)
, quindi sto cercando di fare in questo modo:
(defmacro defconst [const-name const-val]
`(def ^:const ~const-name ~const-val))
Ma questo non funziona:
user=> (macroexpand '(defconst pi 3.14))
(def pi 3.14)
Da quello che ho raccogliere il meta scorciatoia #^<...>
è una macro lettore e per definire una macro che aggiunge alcuni metadati a qualcosa, si dovrebbe usare (with-meta ...)
.
Non ho trovato alcuna documentazione riguardante ^:const
. Questo costrutto sintattico crea persino una sorta di metadati? Seguendo l'esempio non mostra alcuna:
user=> (def ^:const pi 3.14)
#'user/pi
user=> (meta pi)
nil
Grazie per la risposta. Ho controllato facendo '(tempo (dotimes [_ 1e10] (* pi pi)))' vs '(time (dotimes [_ 1e10] (* 3.14 3.14)))' e ammonta allo stesso tempo di esecuzione. – MisterMetaphor
Interessante. Ho perso il punto di 'const' - non ho capito che' const' "vars" ha una ricerca più efficiente. Hanno molto più senso, ora. – Retief