2010-10-17 7 views
13

Je cherche une liste des caractères autorisés dans un mot clé clojure. Plus précisément, je suis intéressé de savoir si l'un des caractères suivants est autorisé: -_/.Quels sont les caractères autorisés dans un mot-clé Clojure?

Je ne suis pas un programmeur java, donc je ne connaîtrais pas les ramifications sous-jacentes le cas échéant. Je ne sais pas si le mot-clé clojure est mappé à un mot-clé java s'il y a une telle chose.

Répondre

14

Modifier:

Quand je composais d'abord cette réponse, j'étais probablement un peu trop lourdement investi dans la question de « ce qui peut vous sortir avec? » En toute justice pour moi-même cependant, la question de l'admissibilité des mots-clés semble être encore en suspens. Alors:

D'abord, un peu de mots-clés, pour les nouveaux lecteurs:

  • Mots-clés sont disponibles en deux saveurs, qualifiés et non qualifiés. Les mots clés non qualifiés, tels que :foo, n'ont aucun composant d'espace de noms. Les mots-clés qualifiés ressemblent à :foo/bar où la partie précédant la barre oblique est l'espace de noms, ostensiblement. Les mots-clés ne peuvent pas être référencés et peuvent avoir un espace de noms inexistant, de sorte que leur comportement dans l'espace de noms est différent des autres objets Clojure.
  • Les mots-clés peuvent être créés soit par des littéraux au lecteur, par exemple :foo, soit par la fonction keyword, qui est (keyword name-str) ou . Les mots-clés ne s'évaluent qu'à eux-mêmes, contrairement aux symboles qui pointent vers les vars. Notez que les mots-clés ne sont pas des symboles.

Qu'est-ce qui est officiellement autorisé?

Selon le code reader documentation, une seule barre oblique est autorisée, aucune période dans le nom et toutes les règles relatives aux symboles.

Qu'est-ce qui est réellement autorisé?

Plus ou moins, sauf les espaces semblent être autorisés dans le lecteur. Par exemple,

user> :-_./asdfgse/aser/se 
:-_./asdfgse/aser/se 

Semble être légal. L'espace de noms pour le mot-clé ci-dessus est:

user> (namespace :-_./asdfgse/aser/se) 
"-_./asdfgse/aser" 

Ainsi, l'espace de noms semble se composer de tout avant la dernière barre oblique.

La fonction keyword est encore plus permissive:

user> (keyword "////+" "/////") 
:////+////// 
user> (namespace (keyword "////+" "/////")) 
"////+" 

Et De même, les espaces sont bien aussi si vous utilisez la fonction keyword. Je ne suis pas sûr exactement quelles limitations sont placées sur les caractères Unicode, mais le REPL ne semble pas se plaindre quand je mets des caractères arbitraires.

Ce qui est susceptible de se produire à l'avenir:

Il y a eu quelques rumeurs au sujet de la validation des mots-clés comme ils sont internées. Supposément l'un des plus ouverts clojure tickets est concerné par la validation des mots-clés. Ainsi, la fonction de mot-clé peut cesser d'être si permissive dans le futur, bien que cela semble être dans l'air. Voir le billet assembla et google group discussion.

+0

Intéressant. Ce que je veux vraiment faire, c'est utiliser des variables de chemin comme mots-clés. Et je ne veux même pas utiliser le ":". Et mes caractères variables de chemin sont limités à # "[A-Za-z0-9 -_ \ /]". Donc je pense que ça devrait aller dans ce cas. – Santosh

+0

Je pense que la vraie réponse est de pointer vers [la documentation du lecteur] (http://clojure.org/reader), qui par exemple interdit clairement plusieurs barres obliques dans les mots-clés et les symboles. – kotarak

+0

@kotarak: Il interdit clairement que dans le cas de symboles. Puisque les mots-clés ne sont pas des symboles, et toute la documentation dit que "les mots-clés sont comme des symboles", je dirais que c'est clair comme de la boue. –

4

De cette liste, le lecteur autorise certainement - et _, mais/a une signification spéciale en tant que délimiteur entre les espaces de noms et les noms de symboles. La période (que vous n'avez pas posée) est également problématique dans les noms de symboles car elle est utilisée dans les noms de classe Java complets. Dans la mesure où l'idiome Clojure va, - est votre meilleur ami dans les noms de symbole. Il prend la place de chameau en Java ou le trait de soulignement en Ruby.

+0

Merci thats ce que je voulais savoir. – Santosh

+0

@Santosh: Dans ce cas, vous devez accepter cette réponse en cliquant sur la coche à gauche. Vous pouvez attendre un peu pour voir si quelqu'un d'autre répond avec des informations supplémentaires que vous ne saviez pas que vous vouliez savoir. – intuited

6

La réponse "correcte" est documented:

Symboles commencent par un caractère non numérique et peuvent contenir des caractères alphanumériques et *, +, -, _ et! (d'autres caractères seront éventuellement autorisés, mais tous les caractères de macro n'ont pas été déterminés). '/' a une signification spéciale, il peut être utilisé une fois au milieu d'un symbole pour séparer l'espace de noms du nom, par ex. my-namespace/foo. '/' nomme lui-même la fonction de division. '.' a une signification particulière - il peut être utilisé une ou plusieurs fois au milieu d'un symbole pour désigner un nom de classe pleinement qualifié, par ex. java.util.BitSet ou dans les noms d'espaces de noms. Symboles commençant ou se terminant par '.' sont réservés par Clojure. Symboles contenant/ou. sont dits «qualifiés». Les symboles commençant ou finissant par ':' sont réservés par Clojure. Un symbole peut contenir un ou plusieurs ':' non répétitifs.

Edit: Et plus loin en ce qui concerne les mots clés:

Les mots clés sont comme des symboles, à l'exception:
* Ils peuvent et doivent commencer par deux points, par exemple : fred
* Ils ne peuvent pas contenir '.' ou nommer des classes.
* Un mot-clé qui commence par deux est résolu dans côlons l'espace de noms en cours

+0

Les mots clés ne sont pas des symboles. –

+0

@Rob Lachlan: Mais les règles pour les symboles sont applicables aux mots-clés. Il y a une petite variation notée dans les documents liés que j'ai édités dans ma réponse. –

+0

Tout d'abord: +1. Deuxièmement, je suppose que le problème que j'ai vraiment avec ceci est que a: le lecteur n'applique pas un bon comportement, et b: il ne semble pas y avoir de mal à autoriser des chaînes arbitraires comme noms de mots-clés et espaces de noms. Depuis tout ce qu'ils sont vraiment sont des chaînes et des hachages dans un ConcurrentHashMap. Actuellement, la fonction de mot-clé nous permet de mettre toutes les chaînes de fou que nous voulons en tant que mots-clés et espaces de noms. Je voterais pour que cela reste comme ça, mais je concéderais que la question (de quel comportement devrait prévaloir) est au-dessus de ma note de salaire. –

3

à partir de 1.3, vous pouvez utiliser ' n'importe où ne démarre pas un mot-clé. si :arthur's-keyword est autorisé maintenant :)

J'utilise les mots-clés :-P et :-D pour pimenter de temps en temps mon code (comme les synonymes de vrai et faux)

+0

+1 pour :-P et :-D! – Gert

+0

Vos synonymes sont intemporels! –

Questions connexes