J'écris du code de clojure qui dépend d'un certain nombre de constantes. P>
Ils seront utilisés dans des boucles internes serrées, il est donc important qu'ils soient utilisés et optimisés aussi efficacement que possible par la combinaison Compiler + JVM. Je serais normalement utilisé une «finale statique publique» constante en Java dans le même but. P>
Quel est le meilleur moyen de déclarer ces? p>
6 Réponses :
Je pense que def code> des choses dans l'espace de noms global est à peu près aussi proche que possible. P>
Ajout de la: Cons-Métadata entraînera l'inlinité au moment de la compilation, voir la réponse par @Amalloy. Les défenseurs globaux sont vars, qui sont closes, peuvent être modifiés et être résolus au moment de l'exécution.
Comme indiqué ci-dessus, utilisez DEF ou ATOM, rappelez-vous que les données sont immuables, donc si vous déclarez des constantes dans une liste, elles ne changent pas. P>
S'il voulait quelque chose de mutable, il demanderait une constante et de toute façon que vous feriez normalement une liste avec des atomes. Vous feriez une liste d'atomes ou une liste de références.
Il n'y a pas de DEFCONST code>, il suffit d'utiliser un def global def est idiomatique; En ce qui concerne l'optimisation, le JIT fera des choses rapidement. P>
Si vraiment, vraiment, vraiment envie de la constante en place (je crois, le JIT remarquera que la valeur étant constante et fera la bonne chose, cependant), vous pouvez utiliser une macro.
(do-stuff (my-constant) in-place)
Si juste en utilisant def code> n'est pas assez rapide, vous pouvez essayer de créer un alias lié code> code> avant de saisir votre boucle serrée pour éviter de passer à travers un Var à chaque fois. p>
Merci, alors ai-je raison de dire que si vous ne le faites pas, cela finira par la déséroférance de la VAR chaque fois que la constante est accessible?
Je crois que Clojure 1.3 (ou peut-être 1.4) vous permet de mettre un Apparemment c'est Clojure 1.3, et c'est ^: constante code> étiquette sur un
def code>, indiquant au compilateur que cela devrait être une constante et Toutes les références doivent être résolues au moment de la compilation. P>
Modifier H1>
^: const code>, pas
^: constante code>. Voir Comment clojure ^: const fonctionne? pour un résumé. P>