Я должен чувствовать себя осторожным о создании clojure ключевые слова, которые имеют несуществующие пространства имен?
Пример был бы: нечто/панель, где нечто пространства имен на самом деле не существует. Это, кажется, возможно, потому что эти ключевые слова ведут себя как литералы. Я не мог найти проблемы, делающие это в REPL, но я обеспокоен возможными проблемами с компиляцией AOT.
Пространство имен фактически будет не может быть создан просто потому, что встречается ключевое слово или символ, который "принадлежит" ему, как показывает следующее взаимодействие с новым REPL:
; SLIME 2010-05-06
user> (-> (.getNamespace :user/foo) symbol)
user
user> (-> (.getNamespace :user/foo) symbol the-ns)
#<Namespace user>
user> (-> (.getNamespace :bar/foo) symbol the-ns)
; java.lang.Exception: No namespace: bar found
Однако это не повод для беспокойства. Поле «пространства имен» ключевого слова или символа - это просто интернированная строка; нет никакой обратной ссылки на соответствующий задействованный объект пространства имен, даже если он существует. Фактически, как можно увидеть выше, метод ключевых слов и символов .getNamespace
возвращает строку, и нужно пройти несколько переходов, чтобы добраться до фактического пространства имен из нее.
Попытка разрешить символ, уточненный пространством имен, с помощью функции resolve
также безопасна. Это независимо от того, существует ли на самом деле пространство имен; в противном случае возвращается nil
, как в случае, когда он существует, но не содержит Var с заданным именем. ns-resolve
, напротив, вызовет исключение, подобное тому, которое упомянуто в приведенном выше фрагменте REPL, если не может найти заданное пространство имен.