Voglio definire una macro che sceglie casualmente una delle espressioni specificate e la valuta. Ad esempio,Clojure: come valutare un modulo quotato nell'ambito locale?
(equal-chance
(println "1")
(println "2"))
deve stampare "1" metà del tempo e "2" l'altra metà.
Ho provato ad utilizzare,
(defmacro equal-chance
[& exprs]
`(rand-nth '~exprs))
ma questo restituisce una delle forme citate, piuttosto che valutarla (vale a dire che sarebbe tornato (println "1")
piuttosto che in realtà la stampa di "1"). Non riesco a utilizzare eval
perché non conserva i binding. Ad esempio,
(let [x 10] (eval '(println x)))
si lamenta che non è in grado di risolvere il simbolo x.
Esiste un modo per valutare un modulo quotato nell'ambito locale? O forse c'è un modo migliore per farlo?
funziona alla grande! non l'avrei mai capito da solo, grazie – Ken
Preferisco usare delay/force piuttosto che fn/call per questo: '(force (rand-nth [~ @ (map (lista parziale \' delay) exprs)]))) ' – amalloy