Las palabras clave son globales , los símbolos no lo son .
Este ejemplo está escrito en JavaScript, pero espero que ayude a transmitir el punto.
const foo = Symbol.for(":foo") // this will create a keyword
const foo2 = Symbol.for(":foo") // this will return the same keyword
const foo3 = Symbol(":foo") // this will create a new symbol
foo === foo2 // true
foo2 === foo3 // false
Cuando construyes un símbolo usando la Symbol
función, obtienes un símbolo distinto / privado cada vez. Cuando solicite un símbolo a través de la Symbol.for
función, obtendrá el mismo símbolo cada vez.
(println :foo) ; Clojure
System.out.println(RT.keyword(null, "foo")) // Java
console.log(System.for(":foo")) // JavaScript
Estos son todos iguales.
Los nombres de argumentos de funciones son locales. es decir, no palabras clave.
(def foo (fn [x] (println x))) ; x is a symbol
(def bar (fn [x] (println x))) ; not the same x (different symbol)