23
¿Cómo podría llamar a una función con una cadena? p.ej. algo como esto:Llamar a una función desde una cadena con el nombre de la función en Clojure
(call "zero?" 1) ;=> false
¿Cómo podría llamar a una función con una cadena? p.ej. algo como esto:Llamar a una función desde una cadena con el nombre de la función en Clojure
(call "zero?" 1) ;=> false
Una respuesta sencilla:
(defn call [this & that]
(apply (resolve (symbol this)) that))
(call "zero?" 1)
;=> false
Sólo por diversión:
(defn call [this & that]
(cond
(string? this) (apply (resolve (symbol this)) that)
(fn? this) (apply this that)
:else (conj that this)))
(call "+" 1 2 3) ;=> 6
(call + 1 2 3) ;=> 6
(call 1 2 3) ;=> (1 2 3)
Algo así como:
(defn call [^String nm & args]
(when-let [fun (ns-resolve *ns* (symbol nm))]
(apply fun args)))
Gracias, 'ns-resolve' en particular era lo que estaba buscando. –
es mejor también combinar ns-resolve junto con fn? para verificar, ese símbolo es función –