Для чего :: используется в закрытии?

83

Я понимаю, что в Clojure есть ключевые слова :keyword. Но для чего это ::используется? Почему это похоже на привязку?

user=> :foo
:foo
user=> ::foo
:user/foo
каринмайер
источник

Ответы:

83

Двойное двоеточие используется для полной квалификации ключевых слов с вашим текущим пространством имен. Это сделано для того, чтобы избежать конфликтов имен ключевых слов, имеющих значение для разных библиотек. Без полностью определенных ключевых слов вы можете случайно перезаписать некоторые значения на карте и нарушить совместимость с библиотекой.

скуро
источник
Что касается предоставленного обоснования, не совсем уверен, зачем вообще нужно переделывать карту, которую должна обрабатывать библиотека. Если это действительно основная мотивация, некоторые пояснения могут помочь.
Matanster
3
одним из примеров может быть промежуточное программное обеспечение для кольца (аналогично фильтрам сервлетов), с помощью которого вы можете дополнить карту, описывающую HTTP-запрос. Ключи с именованными пространствами позволяют вам написать собственное промежуточное ПО для добавления дополнительных значений, не беспокоясь о взаимодействии с любым другим промежуточным ПО, настроенным в вашем кольцевом приложении.
skuro
27

Как теперь описано для Clojure, а также для ClojureScript , ::ключевые слова также могут использоваться для разрешения псевдонимов пространств имен. Например, ::foo/barбудет оцениваться, :clojure.core/barесли fooэто псевдоним clojure.core. Исключение чтения выдается, если fooне разрешается в пространство имен.

Шон Леброн
источник
Эта функция задокументирована там - clojure.org/reference/reader#_literals - cljs.github.io/api/syntax/keyword-qualify
maxp
Также, начиная с Clojure 1.9, актуален #:и #::синтаксис, который используется вместе с картой для разрешения ключевых слов внутри карты, как описано здесь .
Джо Корнели