2010-06-07 8 views
9

¿Debería sentirme cauteloso al crear palabras clave de clojure que tengan espacios de nombres inexistentes?¿Hay algún problema con el espacio de nombre de las palabras clave de clojure en un espacio de nombres inexistente?

Un ejemplo sería: foo/bar, donde el espacio de nombres foo no existe en realidad. Esto parece posible porque estas palabras clave se comportan como literales. No pude encontrar ningún problema al hacer esto en el REPL, pero me preocupan los posibles problemas con la compilación de AOT.

+1

He hecho esto para ciertas cosas en el pasado y no tuve ningún problema. –

Respuesta

7

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.

Cuestiones relacionadas