Поскольку ОП запросил другие возможные способы написания этого макроса (см. Комментарии к принятому ответу), здесь идет речь:
(defmacro exec-all [& commands]
`(doseq [c# ~(vec (map (fn [c]
`(fn [] (println "Code: " '~c "=> Result: " ~c)))
commands))]
(c#)))
Это расширяется до чего-то вроде
(doseq [c [(fn []
(println "Code: " '(conj [2 3 4] 5)
"=> Result: " (conj [2 3 4] 5)))
(fn []
(println "Code: " '(+ 1 2)
"=> Result: " (+ 1 2)))]]
(c))
Обратите внимание, что формы fn
, значения которых будут связаны с c
, собираются в векторе во время расширения макроса.
Излишне говорить, что оригинальная версия проще, поэтому я думаю, что (do ...)
идеальное решение.: -)
Пример взаимодействия:
user=> (exec-all (conj [2 3 4] 5) (+ 1 2))
Code: (conj [2 3 4] 5) => Result: [2 3 4 5]
Code: (+ 1 2) => Result: 3
nil