it-swarm.com.de

Warum hat Clojure neben "Symbolen" auch "Stichwörter"?

Ich kenne andere Lisps (insbesondere Scheme) schon seit langem. Kürzlich habe ich über Clojure gelesen. Ich sehe, dass es sowohl "Symbole" als auch "Schlüsselwörter" hat. Symbole, die ich kenne, aber nicht mit Schlüsselwörtern.

Haben andere Lisps Schlüsselwörter? Wie unterscheiden sich Schlüsselwörter von Symbolen, die keine andere Schreibweise haben (Doppelpunkte)?

124

Hier ist das Clojure-Dokumentation für Schlüsselwörter und Symbole.

Schlüsselwörter sind symbolische Bezeichner, die für sich selbst bewertet werden. Sie bieten sehr schnelle Gleichheitstests ...

Symbole sind Bezeichner, mit denen normalerweise auf etwas anderes verwiesen wird. 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 leichte "konstante Zeichenfolgen" verwendet, z. für die Schlüssel einer Hash-Map oder die Dispatch-Werte 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, ein Symbol überall dort zu verwenden, wo Sie ein Schlüsselwort verwenden (wenn Sie nichts dagegen haben, es ständig zu zitieren).

Der einfachste Weg, den Unterschied zu erkennen, ist Keyword.Java und Symbol.Java in der Clojure-Quelle. Es gibt einige offensichtliche Implementierungsunterschiede. Zum Beispiel kann ein Symbol in Clojure Metadaten haben und ein Schlüsselwort nicht.

Zusätzlich zur Syntax mit einem Doppelpunkt können Sie ein mit einem Namespace qualifiziertes Schlüsselwort mit einem Doppelpunkt erstellen.

user> :foo
:foo
user> ::foo
:user/foo

Common LISP hat Schlüsselwörter, genau wie Ruby und andere Sprachen. Sie unterscheiden sich natürlich geringfügig in diesen Sprachen. Einige Unterschiede zwischen Common LISP-Schlüsselwörtern und Clojure-Schlüsselwörtern:

  1. Schlüsselwörter in Clojure sind keine Symbole.

    user> (symbol? :foo)  
    false
    
  2. Schlüsselwörter gehören keinem Namespace an, es sei denn, Sie qualifizieren sie speziell:

    user> (namespace :foo)
    nil
    user> (namespace ::foo)
    "user"
    

(Danke Rainer Joswig für die Ideen, die ich mir ansehen sollte.)

131
Brian Carper

Common LISP hat Schlüsselwortsymbole.

Stichwörter sind auch Symbole.

(symbolp ':foo) -> T

Was macht Keywords so besonders:

  • : foo wird vom Common LISP-Reader als Symbol-Schlüsselwort :: foo analysiert
  • schlüsselwörter werten zu sich selbst aus:: foo ->: foo
  • das Hauptpaket der Schlüsselwortsymbole ist das KEYWORD-Paket: keyword: foo ->: foo
  • schlüsselwörter werden aus dem Paket KEYWORD exportiert
  • schlüsselwörter sind Konstanten, es ist nicht erlaubt, einen anderen Wert zuzuweisen

Ansonsten sind Stichwörter gewöhnliche Symbole. Schlüsselwörter können also Funktionen benennen oder Eigenschaftslisten haben.

Denken Sie daran: In Common LISP gehören Symbole zu einem Paket. Dies kann geschrieben werden als:

  • foo, wenn das Symbol im aktuellen Paket verfügbar ist
  • foo: bar, wenn das Symbol FOO aus dem Paket BAR exportiert wird
  • foo :: bar, wenn das Symbol FOO im Paket BAR enthalten ist

Für Schlüsselwortsymbole bedeutet dies, dass: foo, keyword: foo und keyword :: foo alle dasselbe Symbol sind. Daher werden die beiden letztgenannten Notationen normalerweise nicht verwendet.

Also: foo wird nur so analysiert, dass es im Paket KEYWORD enthalten ist, vorausgesetzt, dass die Angabe eines Paketnamens vor dem Symbolnamen standardmäßig das KEYWORD-Paket bedeutet.

29
Rainer Joswig

Schlüsselwörter sind Symbole, die für sich selbst bewertet werden, sodass Sie sich nicht daran erinnern müssen, sie zu zitieren.

6
Greg Hewgill

: -Stichwörter werden auch von vielen Sammlungen speziell behandelt, was eine sehr bequeme Syntax ermöglicht.

(:user-id (get-users-map))

ist das gleiche wie

((get-users-map) :user-id)

das macht die Dinge nur ein bisschen flexibler

4
Arthur Ulfeldt

Bei Schlüsselwörtern werden Hash-Werte berechnet und zwischengespeichert, wenn das Schlüsselwort zum ersten Mal erstellt wird. Wenn ein Schlüsselwort als Hash-Schlüssel nachgeschlagen wird, wird einfach der vorberechnete Hash-Wert zurückgegeben. Für Zeichenfolgen und Symbole wird der Hash bei jeder Suche neu berechnet.

Die gleichnamigen Schlüsselwörter sind immer identisch, sie enthalten eigene Hashwerte. Da die Suche in Karten und Mengen aus Hash-Schlüsseln erfolgt, verbessert sich die Sucheffizienz bei zahlreichen Suchvorgängen, nicht bei der eigentlichen Suche.

4
Ivan Pierre