Quiero definir una macro que elige aleatoriamente una de las expresiones dadas y la evalúa. Por ejemplo,Clojure: ¿cómo evaluar un formulario citado en el ámbito local?
(equal-chance
(println "1")
(println "2"))
debe imprimir "1" la mitad del tiempo y "2" la otra mitad.
He intentado utilizar,
(defmacro equal-chance
[& exprs]
`(rand-nth '~exprs))
pero esto vuelve una de las formas citadas, en lugar de evaluar ella (es decir, se volvería (println "1")
en lugar de realmente la impresión de "1"). No puedo usar eval
porque no conserva los enlaces. Por ejemplo,
(let [x 10] (eval '(println x)))
se queja de que no puede resolver el símbolo x.
¿Hay alguna forma de evaluar un formulario entre comillas en el ámbito local? ¿O tal vez hay una mejor manera de hacerlo?
¡esto funciona genial! nunca lo hubiera averiguado por mi cuenta, gracias – Ken
Prefiero usar delay/force en lugar de fn/call para esto: '(force (rand-nth [~ @ (map (partial list \' delay) exprs)])) ' – amalloy