Tenho uma macro (simplifiquei bastante tudo):
(defmacro m1 [error & messages]
`(if ~error
(str "Error: " ~@messages)
(str ~@messages)))
Funciona muito bem. Mas agora quero reutilizá-lo em uma função com args [& messages]
:
Se eu definir esta função da seguinte maneira:
(defn error [& messages]
(m1 true messages))
Funciona, mas incorretamente, é claro. Se eu ligar, (error "msg")
ele retorna"Error: (\"msg\")"
Mas se eu fizer algo como:
(defn error [& messages]
(apply m1 true messages))
Causa um erro
; Erro de sintaxe ao compilar em .... ; Não é possível obter o valor de uma macro
Então a questão é como passar a lista de mensagens para uma macro variada?
Você não pode. As macros operam no momento da expansão da macro e aí
messages
é apenas um símbolo.m1
não precisa ser uma macro - pode ser uma função simples. E sempre que você puder usar uma função em vez de uma macro, você definitivamente deve fazê-lo para evitar problemas semelhantes.