Wofür wird das :: in clojure verwendet?

83

Ich verstehe Schlüsselwörter in Clojure :keyword. Aber wofür wird das ::verwendet? Warum sieht es so aus, als hätte es eine Bindung?

user=> :foo
:foo
user=> ::foo
:user/foo
carinmeier
quelle

Antworten:

83

Der Doppelpunkt dient dazu, Schlüsselwörter mit Ihrem aktuellen Namespace vollständig zu qualifizieren . Dies soll Namenskonflikte für Schlüsselwörter vermeiden, die für verschiedene Bibliotheken von Bedeutung sind. Ohne vollständig qualifizierte Schlüsselwörter können Sie versehentlich einige Werte in einer Karte überschreiben und die Kompatibilität mit einer Bibliothek beeinträchtigen.

Skuro
quelle
Ich bin mir nicht ganz sicher, warum man überhaupt eine Karte basteln sollte, die eine Bibliothek für sie handhaben soll. Wenn das wirklich die Hauptmotivation ist, könnte eine Aufklärung helfen.
Matanster
3
Ein Beispiel könnte die Ring- Middleware (ähnlich wie Servlet-Filter) sein, mit der Sie eine Karte anreichern können, die eine HTTP-Anforderung beschreibt. Mit Namespaced-Schlüsseln können Sie Ihre benutzerdefinierte Middleware schreiben, um zusätzliche Werte hinzuzufügen, ohne sich Gedanken über Interferenzen mit anderen in Ihrer Ring-App konfigurierten Middleware machen zu müssen.
Skuro
27

Wie jetzt sowohl für Clojure als auch für ClojureScript dokumentiert , können ::Schlüsselwörter auch zum Auflösen von Namespace-Aliasnamen verwendet werden. Zum Beispiel ::foo/barwird ausgewertet, :clojure.core/barob fooes sich um einen Alias ​​von handelt clojure.core. Eine Reader-Ausnahme wird ausgelöst, wenn foosie nicht in einen Namespace aufgelöst wird.

Shaun Lebron
quelle
Ebenfalls relevant, da Clojure 1.9 ist #:und #::Syntax, die zusammen mit einer Karte verwendet wird , um die Schlüsselwörter zu lösen innerhalb der Karte, wie erläutert hier .
Joe Corneli