Un espacio de nombres, de hecho, no crearse simplemente porque una palabra clave o símbolo se encontraron con que "pertenecen" a la misma, como la siguiente interacción en una fresca REPL ilustra:
; 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
Sin embargo, esta no es motivo de preocupación El campo "espacio de nombres" de una palabra clave o símbolo es solo una cadena interna; no hay referencia de nuevo al objeto de espacio de nombres correspondiente involucrado, incluso si existe. De hecho, como se puede ver arriba, el método de palabras clave y símbolos .getNamespace
devuelve una cadena y uno tiene que saltar algunos saltos para llegar al espacio de nombres real desde allí.
También es seguro tratar de resolver un símbolo calificado de espacio de nombres con la función resolve
. Eso es independientemente de si el espacio de nombres realmente existe; si no lo hace, se devuelve nil
, como en el caso en que existe, pero no contiene Var del nombre de pila. ns-resolve
, por el contrario, arrojará una excepción como la mencionada en el fragmento del REPL anterior si no puede encontrar el espacio de nombres dado.
He hecho esto para ciertas cosas en el pasado y no tuve ningún problema. –