2011-06-22 6 views
5

I puede cargar fuente Clojure arbitraria usando:Cómo cargar cadena al espacio de nombre actual (no núcleo)?

(load-string source)

Sin embargo, si no se proporcionó espacio de nombres, se carga código para clojure.core espacio de nombres.

Por ejemplo, código siguiente:

(load-string "(defn add [a b] (+ a b))")

define una función:

#'clojure.core/add

Ahora, hay una manera de cargar ese código a algún otro espacio de nombres, preferiblemente el mismo uno en el que se llama a la función load-string?

(. Aparte de anteponiendo una declaración de espacio de nombres a source cadena antes de la evaluación Sé que resolvería el problema - me gustaría saber ¿hay alguna manera preferente)

Respuesta

11

cuando def tiene que decidir qué namspace una la nueva función debe ir en busca del valor actual de la var ns y agrega la nueva función a ese espacio de nombres. porque ns es una var que puede enlazar dinámicamente antes de llamar a la cadena de carga

user> (binding [*ns* (find-ns 'foo)] (load-string "(defn f [] 4)")) 
#'foo/f 
user> (foo/f) 
4 
Cuestiones relacionadas