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