Oto dokumentacja Clojure dotycząca słów kluczowych i symboli.
Słowa kluczowe to symboliczne identyfikatory, które oceniają się same. Zapewniają bardzo szybkie testy równości ...
Symbole to identyfikatory, które są zwykle używane w odniesieniu do czegoś innego. Mogą być używane w formularzach programów do odwoływania się do parametrów funkcji, niech powiązania, nazwy klas i zmienne globalne ...
Słowa kluczowe są zwykle używane jako lekkie „ciągi ciągów”, np. Dla kluczy mapy mieszania lub wartości wysyłania metody multimetodowej. Symbole są zwykle używane do nazywania zmiennych i funkcji i rzadziej manipuluje się nimi bezpośrednio jako obiektami, z wyjątkiem makr i tym podobnych. Ale nic nie stoi na przeszkodzie, abyś używał symbolu wszędzie tam, gdzie używasz słowa kluczowego (jeśli nie masz nic przeciwko cytowaniu ich przez cały czas).
Najłatwiejszym sposobem zobaczenia różnicy jest przeczytanie Keyword.java
i Symbol.java
w źródle Clojure. Istnieje kilka oczywistych różnic w implementacji. Na przykład symbol w Clojure może mieć metadane, a słowo kluczowe nie może.
Oprócz składni z pojedynczym dwukropkiem można użyć podwójnego dwukropka, aby utworzyć słowo kluczowe kwalifikujące się do przestrzeni nazw.
user> :foo
:foo
user> ::foo
:user/foo
Common Lisp ma słowa kluczowe, podobnie jak Ruby i inne języki. Oczywiście w tych językach są nieco inne. Niektóre różnice między słowami kluczowymi Common Lisp a słowami kluczowymi Clojure:
Słowa kluczowe w Clojure nie są symbolami.
user> (symbol? :foo)
false
Słowa kluczowe nie należą do żadnej przestrzeni nazw, chyba że specjalnie je zakwalifikujesz:
user> (namespace :foo)
nil
user> (namespace ::foo)
"user"
(Dziękuję Rainerowi Joswigowi za przedstawienie mi pomysłów na rzeczy do obejrzenia.)