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

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

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

1 Ответ

7 голосов
/ 08 июня 2010

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

Однако это не повод для беспокойства.Поле "namespace" ключевого слова или символа - это просто интернированная строка;нет обратной ссылки на соответствующий объект пространства имен, даже если он существует.На самом деле, как видно из приведенного выше, метод ключевых слов и символов .getNamespace возвращает строку, и для этого нужно прыгнуть несколько прыжков, чтобы добраться до фактического пространства имен.

Попытка разрешить пространство имен -квалифицированный символ с функцией resolve также безопасен.Это независимо от того, существует ли пространство имен на самом деле;если это не так, возвращается nil, как в случае, если он существует, но не содержит Var с данным именем.ns-resolve, напротив, сгенерирует исключение, подобное тому, которое упоминается во фрагменте из REPL выше, если оно не может найти данное пространство имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...