2010-08-04 21 views
12

En clojure 1.2RC1, deseo obtener una función basada en su nombre como cadena y evaluarla.Función resolviendo clojure desde el nombre de cadena

Definición de la función

(ns my-ns) 

(defn mycar [x] (first x)) 

La siguiente trabajaron:

((ns-resolve *ns* (symbol "mycar")) '(3 4)) 
((intern *ns* (symbol "mycar")) '(3 4)) 
((eval (symbol "mycar")) '(3 4)) 

pero parece feo. ¿Hay una mejor manera? Si no, ¿cuál de los anteriores es el más idiomático?

Respuesta

13

Esto funcionó para mí sin utilizar eval:

user> (defn mycar [x] (first x)) 
#'user/mycar 
user> ((resolve (symbol "mycar")) [1 2 3]) 
1 

Esto funciona porque resuelve encuentra el mycar var en el espacio de nombres actual y la var llama a la función es obligado a. Esta es una versión más corta de tu primer ejemplo. Lo usaría solo para evitar el uso de eval.

+1

En segundo lugar el uso de 'resolver' o' ns-resolve'. También presta mucha atención cuando uses 'intern'. Es bastante malograr cosas usándolo. – kotarak

+0

¿Alguna sugerencia para obtener más información sobre "paliza" causada por pasante? – chris

+0

Establezca un Var con pasante y sus metadatos originales en el Var desaparecerán. Ignorar. Parece ser arreglado. Al menos no puedo reproducirlo más. – kotarak

Cuestiones relacionadas