web-dev-qa-db-fra.com

Pourquoi Clojure a-t-il des "mots-clés" en plus des "symboles"?

J'ai une connaissance passagère des autres Lisps (en particulier Scheme) depuis longtemps. Récemment, j'ai lu sur Clojure . Je vois qu'il a à la fois des "symboles" et des "mots clés". Les symboles que je connais, mais pas les mots clés.

Les autres lisps ont-ils des mots clés? En quoi les mots-clés diffèrent-ils des symboles autres que d'avoir une notation différente (c.-à-d.: Deux-points)?

124

Voici la documentation Clojure pour les mots-clés et les symboles.

Les mots clés sont des identifiants symboliques qui s'évaluent eux-mêmes. Ils fournissent des tests d'égalité très rapides ...

Les symboles sont des identifiants qui sont normalement utilisés pour faire référence à autre chose. Ils peuvent être utilisés dans les formulaires de programme pour faire référence aux paramètres de fonction, aux liaisons de let, aux noms de classe et aux variables globales ...

Les mots clés sont généralement utilisés comme des "chaînes constantes" légères, par exemple pour les clés d'une carte de hachage ou les valeurs de répartition d'une multiméthode. Les symboles sont généralement utilisés pour nommer les variables et les fonctions et il est moins courant de les manipuler directement en tant qu'objets, sauf dans les macros et autres. Mais rien ne vous empêche d'utiliser un symbole partout où vous utilisez un mot-clé (si cela ne vous dérange pas de les citer tout le temps).

La façon la plus simple de voir la différence est de lire Keyword.Java et Symbol.Java dans la source Clojure. Il existe quelques différences de mise en œuvre évidentes. Par exemple, un symbole dans Clojure peut avoir des métadonnées et un mot-clé ne peut pas.

En plus de la syntaxe à deux points, vous pouvez utiliser deux points pour créer un mot clé qualifié d'espace de noms.

user> :foo
:foo
user> ::foo
:user/foo

LISP commun a des mots clés, tout comme Ruby et d'autres langues. Ils sont légèrement différents dans ces langues bien sûr. Quelques différences entre les mots clés LISP communs et les mots clés Clojure:

  1. Les mots clés dans Clojure ne sont pas des symboles.

    user> (symbol? :foo)  
    false
    
  2. Les mots clés n'appartiennent à aucun espace de noms, sauf si vous les qualifiez spécifiquement:

    user> (namespace :foo)
    nil
    user> (namespace ::foo)
    "user"
    

(Merci Rainer Joswig de m'avoir donné des idées de choses à regarder.)

131
Brian Carper

LISP commun a des symboles de mots clés.

Les mots-clés sont aussi des symboles.

(symbolp ':foo) -> T

Ce qui rend les mots clés spéciaux:

  • : foo est analysé par le lecteur LISP commun comme le mot clé symbol :: foo
  • les mots-clés s'évaluent:: foo ->: foo
  • le package principal des symboles de mots clés est le package KEYWORD: keyword: foo ->: foo
  • les mots clés sont exportés à partir du package KEYWORD
  • les mots clés sont des constantes, il n'est pas autorisé d'attribuer une valeur différente

Sinon, les mots clés sont des symboles ordinaires. Les mots clés peuvent donc nommer des fonctions ou avoir des listes de propriétés.

Rappelez-vous: dans les symboles LISP communs appartiennent à un package. Cela peut s'écrire:

  • foo, quand le symbole est accessible dans le paquet courant
  • foo: bar, lorsque le symbole FOO est exporté du package BAR
  • foo :: bar, lorsque le symbole FOO est dans le package BAR

Pour les symboles de mots-clés, cela signifie que: foo, keyword: foo et keyword :: foo sont tous le même symbole. Ainsi, les deux dernières notations ne sont généralement pas utilisées.

Donc: foo est simplement analysé pour être dans le package KEYWORD, en supposant que ne donner aucun nom de package avant le nom du symbole signifie par défaut le package KEYWORD.

29
Rainer Joswig

Les mots clés sont des symboles qui s'évaluent d'eux-mêmes, vous n'avez donc pas à vous rappeler de les citer.

6
Greg Hewgill

: les mots clés sont également traités spécialement par de nombreuses collections, ce qui permet une syntaxe vraiment pratique.

(:user-id (get-users-map))

est le même que

((get-users-map) :user-id)

cela rend les choses un peu plus flexibles

4
Arthur Ulfeldt

Pour les mots clés, les valeurs de hachage sont calculées et mises en cache lors de la construction du mot clé. Lorsque vous recherchez un mot clé comme clé de hachage, il renvoie simplement la valeur de hachage précalculée. Pour les chaînes et les symboles, le hachage est recalculé à chaque recherche.

La raison pour laquelle les mêmes mots-clés nommés sont toujours identiques, ils contiennent leurs propres valeurs de hachage. Comme la recherche dans les cartes et les ensembles est faite à partir de clés de hachage, cela implique une meilleure efficacité de recherche en cas de nombreuses recherches, pas dans la recherche elle-même.

4
Ivan Pierre