Pregunta

Me gustaría hacer esto (en REPL o en cualquier lugar)

(defn (symbol "print-string") [k] (println k))

y luego ser capaz de hacer

(print-string "lol")

O, si hay alguna otra manera de crear defn de cadenas personalizadas en macroses, ¿podría empujar en la dirección correcta por favor?

¿Fue útil?

Solución

(defmacro defn-with-str [string args & body]
 `(defn ~(symbol string) ~args ~@body))

(defn-with-str "print-string" [k] (println k))

(print-string "lol")

Otros consejos

La solución de dnolen funciona en tiempo de expansión de la macro, de Brian Carper en la lectura en tiempo. Ahora, aquí está uno para el tiempo de ejecución:

(intern *ns* (symbol "a") (fn [k] (println k)))

Me gusta la respuesta de dnolen mejor, pero se puede hacer esto también:

(defn #=(symbol "print-string") [k] (println k))

#=() se evalúa en el tiempo de leer. No sé qué tan estable es una característica de Clojure esto es, yo no confiar en ella para no cambiar en el futuro. Las macros son la forma en que lo haría.

FYI -. La respuesta de dnolen sólo funcionará para las cadenas literales, y no para las cadenas en def'd o variables let'd

(defmacro defn-con-str [args y cuerpo de cuerda]  `(Defn ~ (cadena de símbolos) ~ ~ @ args cuerpo))

(def hisym "Hola") (Defn-con-str hisym [] (println "hi"))

Ahora tiene una función llamada "hisym"

(hi) -> java.lang.Exception: No se puede resolver símbolo: hola en este contexto (NO_SOURCE_FILE: 6) (Hisym) -> imprime "Hola"

Para evitar esto, la cadena eval nombre de función en la macro

(defmacro defn-with-str [string args & body]
`(defn ~(symbol (eval string)) ~args ~@body))

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top