2012-02-07 15 views
5

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 

risposta

10

Il primo problema è che si stanno esaminando i metadati di 3.14. Utilizzare (meta (var pi)) per vedere i metadati di pi. Se lo fai, vedrai che include :const true.

(defmacro defconst [const-name const-val] 
    `(def 
    ~(with-meta const-name 
     (assoc (meta const-name) :const true)) 
    ~const-val)) 

riproduce fedelmente i metadati e le prestazioni del ^:const (il codice è adattato dalla fonte di defn-).

+0

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

+0

Interessante. Ho perso il punto di 'const' - non ho capito che' const' "vars" ha una ricerca più efficiente. Hanno molto più senso, ora. – Retief

Problemi correlati