Ich habe von jeher ein vorübergehendes Wissen über andere Lisps (insbesondere das Schema). Kürzlich habe ich über Clojure gelesen . Ich sehe, dass es sowohl "Symbole" als auch "Schlüsselwörter" hat. Symbole, mit denen ich vertraut bin, aber nicht mit Schlüsselwörtern.
Haben andere Lisps Schlüsselwörter? Wie unterscheiden sich Schlüsselwörter von anderen Symbolen als einer anderen Notation (dh Doppelpunkte)?
Antworten:
Hier ist die Clojure-Dokumentation für Schlüsselwörter und Symbole.
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
undSymbol.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.
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.
Schlüsselwörter gehören zu keinem Namespace, es sei denn, Sie qualifizieren sie speziell:
(Danke, Rainer Joswig, dass du mir Ideen für Dinge gegeben hast, die ich mir ansehen kann.)
quelle
(eval (eval ':a))
vs(eval (eval ''a))
. Gibt es noch andere Vorteile? Leistungstechnisch sind sie identisch?Common Lisp hat Schlüsselwortsymbole.
Schlüsselwörter sind auch Symbole.
Was macht Keywords so besonders:
Ansonsten sind Schlüsselwörter gewöhnliche Symbole. So können Schlüsselwörter Funktionen benennen oder Eigenschaftslisten haben.
Denken Sie daran: In Common Lisp gehören Symbole zu einem Paket. Dies kann geschrieben werden als:
Für Schlüsselwortsymbole bedeutet dies, dass: foo, Schlüsselwort: foo und Schlüsselwort :: foo alle dasselbe Symbol sind. Daher werden die beiden letztgenannten Notationen normalerweise nicht verwendet.
Also: foo wird nur analysiert, um im Paket KEYWORD zu sein, vorausgesetzt, dass die Angabe eines Paketnamens vor dem Symbolnamen standardmäßig das KEYWORD-Paket bedeutet.
quelle
Schlüsselwörter sind Symbole, die sich selbst bewerten, sodass Sie nicht daran denken müssen, sie zu zitieren.
quelle
: Schlüsselwörter werden auch von vielen Sammlungen speziell behandelt, was eine sehr praktische Syntax ermöglicht.
ist das gleiche wie
das macht die dinge nur ein wenig flexibler
quelle
Bei Schlüsselwörtern werden Hashwerte berechnet und zwischengespeichert, wenn das Schlüsselwort zum ersten Mal erstellt wird. Wenn Sie ein Schlüsselwort als Hash-Schlüssel suchen, wird einfach der vorberechnete Hash-Wert zurückgegeben. Bei Zeichenfolgen und Symbolen wird der Hash bei jeder Suche neu berechnet.
Die gleichnamigen Schlüsselwörter sind immer identisch und enthalten ihre eigenen Hashwerte. Da die Suche in Karten und Sets über Hash-Schlüssel erfolgt, bedeutet dies eine bessere Sucheffizienz bei zahlreichen Suchvorgängen, nicht bei der Suche selbst.
quelle
Schlüsselwörter sind global , Symbole nicht .
Dieses Beispiel ist in JavaScript geschrieben, aber ich hoffe, es hilft, den Punkt zu vermitteln.
Wenn Sie ein Symbol mit der
Symbol
Funktion erstellen, erhalten Sie jedes Mal ein eindeutiges / privates Symbol. Wenn Sie über dieSymbol.for
Funktion nach einem Symbol fragen , erhalten Sie jedes Mal das gleiche Symbol zurück.Diese sind alle gleich.
Funktionsargumentnamen sind lokal. dh keine Schlüsselwörter.
quelle