Я хочу определить макрос, который случайным образом выбирает одно из заданных выражений и оценивает его. Например,
(equal-chance
(println "1")
(println "2"))
должен напечатать «1» половину времени, а «2» - другую половину.
Я пытался использовать,
(defmacro equal-chance
[& exprs]
`(rand-nth '~exprs))
но это возвращает одну из указанных в кавычках форм, а не ее оценку (то есть она вернет (println "1")
вместо фактической печати "1") Я не могу использовать eval
, потому что он не сохраняет привязки. Например,
(let [x 10] (eval '(println x)))
жалуется, что не может разрешить символ x.
Есть ли способ оценить цитируемую форму в локальной области? Или, может быть, есть лучший способ сделать это?