Aqui está a documentação do Clojure para palavras-chave e símbolos.
Palavras-chave são identificadores simbólicos que se avaliam. Eles fornecem testes de igualdade muito rápidos ...
Símbolos são identificadores que normalmente são usados para se referir a outra coisa. Eles podem ser usados em formulários de programas para se referir a parâmetros de função, deixar ligações, nomes de classes e vars globais ...
Palavras-chave são geralmente usadas como "seqüências constantes" leves, por exemplo, para as chaves de um mapa de hash ou os valores de despacho de um método múltiplo. Os símbolos geralmente são usados para nomear variáveis e funções e é menos comum manipulá-los como objetos diretamente, exceto em macros e coisas do tipo. Mas não há nada que o impeça de usar um símbolo em todos os lugares em que você usa uma palavra-chave (se você não se importa de citá-las o tempo todo).
A maneira mais fácil de ver a diferença é ler Keyword.java
e Symbol.java
na fonte Clojure. Existem algumas diferenças óbvias na implementação. Por exemplo, um símbolo no Clojure pode ter metadados e uma palavra-chave não.
Além da sintaxe de dois pontos, você pode usar dois pontos para criar uma palavra-chave qualificada para namespace.
user> :foo
:foo
user> ::foo
:user/foo
O Lisp comum possui palavras-chave, assim como Ruby e outros idiomas. Eles são um pouco diferentes nessas línguas, é claro. Algumas diferenças entre as palavras-chave Common Lisp e as palavras-chave Clojure:
Palavras-chave em Clojure não são símbolos.
user> (symbol? :foo)
false
As palavras-chave não pertencem a nenhum espaço para nome, a menos que você as qualifique especificamente:
user> (namespace :foo)
nil
user> (namespace ::foo)
"user"
(Obrigado Rainer Joswig por me dar idéias sobre o que examinar.)