Conventions, Style, et Usage pour les constantes de Clojure?

quelles sont les meilleures pratiques pour définir les constantes de Clojure en termes de style, de conventions, d'efficacité, etc.

par exemple, est-ce juste?

(def *PI* 3.14)

Questions:

les constantes doivent-elles être capitalisées dans Clojure?

stylistiquement, devraient-ils avoir l'astérisque (*) sur un ou deux côtés?

y a-t-il des considérations relatives à l'efficacité du calcul dont je devrais être au courant?

38
demandé sur Julien Chastang 2010-08-27 00:07:20

8 réponses

de http://dev.clojure.org/display/community/Library+codage+normes :

N'utiliser earmuffs que pour les objets destinés à la reliure. N'utilisez pas de notation spéciale pour les constantes; tout est supposé une constante sauf indication contraire.

41
répondu Max 2013-08-02 12:52:20

Je ne pense pas qu'il y ait de règles strictes. D'habitude, je ne leur accorde aucun traitement spécial. Dans un langage fonctionnel, il y a moins de distinction entre une constante et toute autre valeur, parce que les choses sont plus souvent pures.

les astérisques des deux côtés sont appelés "OAR muffs" en Clojure. Ils sont généralement utilisés pour indiquer un var "spécial", ou un var qui sera dynamiquement rebond en utilisant la liaison plus tard. Des trucs comme out et dans qui sont de temps en temps de rebond à différents flux par les utilisateurs et tels sont des exemples.

personnellement, je l'appellerais simplement pi . Je ne pense pas avoir jamais vu des gens donner des noms spéciaux à constant dans Clojure.

EDIT: Mister Carper vient de faire remarquer qu'il capitalise lui-même les constantes dans son code parce que c'est une convention dans d'autres langues. Je suppose que cela montre qu'il y a au moins des gens qui n' que.

j'ai jeté un coup d'oeil rapide sur les normes de codage mais je n'ai rien trouvé à ce sujet. Cela m'amène à conclure que c'est à vous de décider si vous les capitalisez ou non. Je ne pense pas que quelqu'un vous tape dans le long terme.

23
répondu Rayne 2013-09-29 16:48:37

sur le plan de l'efficacité computationnelle, vous devez savoir qu'il n'existe pas de constante globale à Clojure. Ce que vous avez ci-dessus est un var, et chaque fois que vous le référencez, il fait une recherche. Même si vous ne mettez pas de cache-oreilles dessus, vars peut toujours être rebond, de sorte que la valeur peut toujours changer, de sorte qu'ils sont toujours regardés dans une table. Pour les boucles critiques de performance, ce n'est décidément pas optimal.

Il ya quelques options comme mettre un bloc let autour vos boucles critiques et laissez la valeur de n'importe quel var" constant " pour qu'elles ne soient pas levées. Ou créer une macro no-arg pour que la valeur constante soit compilé dans le code. Ou vous pouvez créer une classe Java avec un membre statique.

Voir ce post, et à la suite de la discussion à propos des constantes pour plus d'info:

http://groups.google.com/group/clojure/msg/78abddaee41c1227

13
répondu pjstadig 2010-08-26 22:06:06

Les cache-oreilles sont un moyen de représentation d'un symbole donné aura son propre thread-local liaison à un certain point. En tant que tel, il n'est pas logique d'appliquer les oreillettes à votre constante Pi.

*clojure-version* est un exemple de constante dans Clojure, et il est entièrement en minuscule.

8
répondu Anders 2010-08-26 23:24:02

N'utilisez pas de notation spéciale pour les constantes; tout est supposé être une constante sauf indication contraire.

voir http://dev.clojure.org/display/community/Library+codage+normes

4
répondu espeed 2013-08-02 12:52:50

Clojure a une variété de littérales telles que:

3.14159
:point
{:x 0 
 :y 1}
[1 2 3 4]
#{:a :b :c}

les littérales sont constantes. Autant que je sache, il n'y a aucun moyen de définir de nouvelles littéraux. Si vous voulez utiliser une nouvelle constante, vous pouvez effectivement générer un littéral dans le code à la compilation:

(defmacro *PI* [] 3.14159265358979323)
(prn (*PI*))
1
répondu jhuni 2011-09-09 12:39:27

dans Common Lisp, il y a une convention de nommage des constantes avec les signes plus ( +my-constant+ ), et dans Scheme, en préfixant avec un signe dollar ( $my-constant ); voir cette page . Une telle convention entre en conflit avec les normes officielles de codage Clojure, liées dans d'autres réponses, mais il serait peut-être raisonnable de vouloir distinguer les RPV réguliers de ceux définis avec l'attribut :const .

je pense qu'il y a un avantage à donner des variables non fonctionnelles, de quelque nature que ce soit, une sorte de trait distinctif. Supposons qu'en plus des variables définies pour contenir les fonctions, vous n'utilisez généralement que des noms locaux définis par les paramètres de fonction, let , etc. Si vous définissez néanmoins occasionnellement une variable non-fonctionnelle en utilisant def , alors quand son nom apparaît dans une définition de fonction dans le même fichier, il ressemble à une variable locale. Si la fonction est complexe, vous pouvez passer plusieurs secondes à chercher nom définition dans la fonction. L'ajout d'une caractéristique distinctive comme des boucles d'oreilles ou des signes plus ou tout autre majuscule, selon l'utilisation de la variable, rend évident que la définition de la variable est ailleurs.

en outre, il ya de bonnes raisons de donner des constantes spéciales comme pi un nom spécial, de sorte que personne n'a à se demander si pi signifie, par exemple," imprimer-index", ou l'i-th pizza, ou"interface préservée". Bien sûr i penser ces variables devraient avoir des noms plus informatifs, mais beaucoup de gens utilisent des noms cryptiques, variables courtes, et je finis par lire leur code. Je ne devrais pas me demander si pi signifie pi, donc quelque chose comme PI pourrait avoir du sens. Personne ne penserait que c'est une série de la variable mill à Clojure.

1
répondu Mars 2016-05-09 15:53:32

selon le livre "Practical Clojure", il devrait être nommé *pi*

0
répondu Aymen 2010-08-27 08:18:27