133 votes

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 comporte à la fois des "symboles" et des "mots-clés". Symboles que je connais bien, mais pas avec des mots-clés.

Est-ce que d'autres Lisps ont des mots-clés? En quoi les mots clés sont-ils différents des symboles autres que ceux ayant une notation différente (c'est-à-dire: deux points)?

142voto

Brian Carper Points 40078

Voici la Clojure de la documentation pour les mots clés et les Symboles.

Les mots clés sont symboliques des identificateurs d'évaluer eux-mêmes. Ils fournissent très rapide tests d'égalité...

Les symboles sont des identifiants qui sont normalement utilisés pour se référer à quelque chose d'autre. Ils peuvent être utilisés dans les formulaires du programme à consulter les paramètres de la fonction, laissez-les liaisons, les noms de classe et les variables globales...

Les mots clés sont généralement utilisés comme léger "chaines", par exemple pour les touches d'un hachage de la carte ou de l'envoi des valeurs de multimethod. Les symboles sont généralement utilisés pour nommer les variables et de fonctions, et il est moins fréquent de les manipuler comme des objets directement à l'exception des macros et autres. Mais il n'y a rien qui vous empêche d'utiliser un symbole partout où vous utilisez un mot-clé (si vous n'avez pas l'esprit en citant tout le temps).

Le moyen le plus facile de voir la différence, c'est de lire Keyword.java et Symbol.java dans le Clojure source. Il y a quelques différences d'implémentation. Par exemple, un Symbole en Clojure peut avoir des métadonnées et un mot-Clé ne peut pas.

En plus de célibataires à deux points de syntaxe, vous pouvez utiliser un double deux-points pour faire un espace de noms qualifiés mot-clé.

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

Common Lisp a des mots-clés, comme le Rubis et d'autres langues. Elles sont légèrement différentes dans ces deux langues, bien sûr. Quelques différences entre la Common Lisp mots-clés et Clojure mots-clés:

  1. Mots clés en Clojure ne sont pas des Symboles.

    user> (symbol? :foo)  
    false
    
  2. Mots-clés n'appartiennent à aucun espace de noms, sauf si vous précisément les qualifier:

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

(Merci Rainer Joswig pour me donner des idées de choses à regarder.)

30voto

Rainer Joswig Points 62532

Common Lisp a mot-clé symboles.

Les mots clés sont des symboles, trop.

(symbolp ':foo) -> T

Ce qui rend les mots-clés spéciales:

  • :foo est analysé par le Common Lisp lecteur comme le symbole de mot-clé::foo
  • mots clés d'évaluer eux-mêmes: :foo -> :foo
  • la maison paquet de mot-clé symboles est le mot-CLÉ package: mot-clé:foo -> :foo
  • les mots clés sont exportés à partir du mot-CLÉ package
  • les mots clés sont des constantes, il n'est pas autorisé à attribuer une valeur différente

Sinon, les mots clés sont des symboles ordinaires. Tellement de mots-clés peut nom des fonctions ou des biens sont des listes.

Rappelez-vous: en Common Lisp symboles appartiennent à un package. Cela peut être écrite comme:

  • toto, lorsque le symbole est accessible dans le package en cours
  • foo:bar, lorsque le symbole FOO est exporté à partir du package BAR
  • foo::bar, lorsque le symbole FOO est dans le package BAR

Pour le mot-clé des symboles qui signifie que :foo, mot-clé:foo et le mot-clé::foo sont tous le même symbole. Ainsi, les deux dernières notations sont généralement pas utilisés.

Donc :foo est juste analysée pour être dans le mot-CLÉ package, en supposant que le fait de donner aucun nom du package avant le nom du symbole signifie que, par défaut, le mot-CLÉ package.

6voto

Greg Hewgill Points 356191

Les mots-clés sont des symboles qui s’évaluent eux-mêmes. Vous n’avez donc pas besoin de vous en rappeler.

5voto

Arthur Ulfeldt Points 45059

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

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

est le même que

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

cela rend les choses un peu plus flexibles

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X