Ответ 1
В одном месте, где Clojure в настоящее время требуются ключевые слова с именами, используется при использовании функции функции extend
для добавления реализации протокола к существующему типу. (Это 1.2 функциональность, доступная с последними моментальными снимками, но не стабильная версия 1.1). Соответствующий фрагмент из (doc extend)
:
extend принимает тип/класс (или интерфейс, см. ниже) и один или несколько протокол + пары методов. Это расширит полиморфизм протокольные методы для вызова предоставленных методов, когда AType в качестве первого аргумента. Обратите внимание, что указаны типы deftype используя теги ключевых слов:
:: MyType или: my.ns/MyType
Действительно, для типа Apple и протокола Eatable:
(deftype Apple [colour])
(defprotocol Eatable (eat [x]))
следующее генерирует исключение (No implementation of method: :eat
и т.д.):
(extend :Apple Eatable {:eat (fn [x] (println (str (name (:colour x)) ", yummy!")))})
(eat (Apple :red))
в то время как это выводит red, yummy!
:
(extend ::Apple Eatable {:eat (fn [x] (println (str (name (:colour x)) ", yummy!")))})
(eat (Apple :red))
Примечание. Я только что набрал все это в REPL. Также обратите внимание, что если вы хотите воспроизвести его, вам лучше всего ввести его/вставить в приведенном выше порядке; например переоценка любой из форм (deftype Apple [colour])
и (defprotocol Eatable (eat [x]))
(или даже тех и других) не делает Clojure забыть о реализации протокола.
Опять же, это функция 1.2, поэтому она даже не существует в 1.1 и может измениться до фактической версии 1.2.
Совместное использование хэш-карты между несколькими пространствами имен является еще одним возможным вариантом использования, как говорит Брайан. Обратите внимание, что нет необходимости использовать ссылочный тип. Скажите, есть куча библиотек, которые, возможно, могут быть добавлены в будущем, - которые манипулируют (возможно, преобразуют, возможно, просто наблюдают) хеш-карты с ключевыми словами, где каждая библиотека может определять, какие ключевые слова она ищет, и что он использует их; то у вас может возникнуть соблазн использовать ключевые слова с именами, чтобы избежать столкновений.
На самом деле, в настоящее время существует пример, который совсем не надуман, а именно Ring spec v0.1 (ключевой элемент сегодняшней экосистемы Clojure Web). См. сообщение о запросе на ключевое слово с именами и ответами в группу Ring Google (сделанные автором Ring
Mark McGranaghan) за некоторое понимание обоснования этого дизайнерского решения, а также за решение больше не требовать использования имен в ключевых словах в Ring spec v0.2. Там также сообщение Джеймса Ривза (автора Compojure) в поддержку изменения.
В конечном счете, как и все пространства имен, это функция предотвращения столкновений. Clojure код, который написан в настоящее время, не имеет тенденций заботиться о наличии "private" ключевых слов, поэтому они не видят большого использования; но хорошо иметь их доступными, когда они могут изменить ситуацию.