Hier ist die Clojure-Dokumentation für Schlüsselwörter und Symbole.
Schlüsselwörter sind symbolische Bezeichner, die sich selbst bewerten. Sie bieten sehr schnelle Gleichstellungstests ...
Symbole sind Bezeichner, die normalerweise verwendet werden, um auf etwas anderes zu verweisen. Sie können in Programmformularen verwendet werden, um auf Funktionsparameter zu verweisen, Bindungen, Klassennamen und globale Variablen zuzulassen ...
Schlüsselwörter werden im Allgemeinen als einfache "konstante Zeichenfolgen" verwendet, z. B. für die Schlüssel einer Hash-Map oder die Versandwerte einer Multimethode. Symbole werden im Allgemeinen verwendet, um Variablen und Funktionen zu benennen, und es ist weniger üblich, sie als Objekte direkt zu bearbeiten, außer in Makros und dergleichen. Aber nichts hindert Sie daran, überall dort, wo Sie ein Schlüsselwort verwenden, ein Symbol zu verwenden (wenn es Ihnen nichts ausmacht, sie ständig zu zitieren).
Der einfachste Weg, um den Unterschied zu erkennen, ist das Lesen Keyword.java
und Symbol.java
in der Clojure-Quelle. Es gibt einige offensichtliche Implementierungsunterschiede. Beispielsweise kann ein Symbol in Clojure Metadaten enthalten und ein Schlüsselwort nicht.
Zusätzlich zur Syntax mit einem Doppelpunkt können Sie einen Doppelpunkt verwenden, um ein Namespace-qualifiziertes Schlüsselwort zu erstellen.
user> :foo
:foo
user> ::foo
:user/foo
Common Lisp hat Schlüsselwörter, ebenso wie Ruby und andere Sprachen. In diesen Sprachen unterscheiden sie sich natürlich geringfügig. Einige Unterschiede zwischen Common Lisp-Schlüsselwörtern und Clojure-Schlüsselwörtern:
Schlüsselwörter in Clojure sind keine Symbole.
user> (symbol? :foo)
false
Schlüsselwörter gehören zu keinem Namespace, es sei denn, Sie qualifizieren sie speziell:
user> (namespace :foo)
nil
user> (namespace ::foo)
"user"
(Danke, Rainer Joswig, dass du mir Ideen für Dinge gegeben hast, die ich mir ansehen kann.)