Aquí está la documentación de Clojure para palabras clave y símbolos.
Las palabras clave son identificadores simbólicos que se evalúan a sí mismos. Proporcionan pruebas de igualdad muy rápidas ...
Los símbolos son identificadores que normalmente se usan para referirse a otra cosa. Se pueden usar en formularios de programa para referirse a parámetros de función, enlaces, nombres de clase y variables globales ...
Las palabras clave se utilizan generalmente como "cadenas constantes" ligeras, por ejemplo, para las claves de un mapa hash o los valores de envío de un método múltiple. Los símbolos generalmente se usan para nombrar variables y funciones y es menos común manipularlos como objetos directamente, excepto en macros y demás. Pero no hay nada que le impida usar un símbolo en todas partes donde use una palabra clave (si no le importa citarlos todo el tiempo).
La forma más fácil de ver la diferencia es leer Keyword.java
y Symbol.java
en la fuente Clojure. Hay algunas diferencias obvias de implementación. Por ejemplo, un símbolo en Clojure puede tener metadatos y una palabra clave no.
Además de la sintaxis de dos puntos, puede usar dos puntos para crear una palabra clave calificada para el espacio de nombres.
user> :foo
:foo
user> ::foo
:user/foo
Common Lisp tiene palabras clave, al igual que Ruby y otros idiomas. Son un poco diferentes en esos idiomas, por supuesto. Algunas diferencias entre las palabras clave Common Lisp y las palabras clave Clojure:
Las palabras clave en Clojure no son símbolos.
user> (symbol? :foo)
false
Las palabras clave no pertenecen a ningún espacio de nombres a menos que las califique específicamente:
user> (namespace :foo)
nil
user> (namespace ::foo)
"user"
(Gracias a Rainer Joswig por darme ideas de cosas para mirar).