Есть ли какая-либо проблема с пространством имен clojure ключевые слова в несуществующем пространстве имен?

Я должен чувствовать себя осторожным о создании clojure ключевые слова, которые имеют несуществующие пространства имен?

Пример был бы: нечто/панель, где нечто пространства имен на самом деле не существует. Это, кажется, возможно, потому что эти ключевые слова ведут себя как литералы. Я не мог найти проблемы, делающие это в REPL, но я обеспокоен возможными проблемами с компиляцией AOT.

9
задан Rob Lachlan 7 June 2010 в 12:56
поделиться

1 ответ

Пространство имен фактически будет не может быть создан просто потому, что встречается ключевое слово или символ, который "принадлежит" ему, как показывает следующее взаимодействие с новым 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, если не может найти заданное пространство имен.

7
ответ дан 3 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: