我有一个宏(我已经简化了一切):
(defmacro m1 [error & messages]
`(if ~error
(str "Error: " ~@messages)
(str ~@messages)))
它运作得很好。但现在我想在带有 args 的函数中重用它[& messages]
:
如果我按以下方式定义这个函数:
(defn error [& messages]
(m1 true messages))
它有效,但当然是错误的。如果我调用(error "msg")
它返回"Error: (\"msg\")"
但如果我做类似的事情:
(defn error [& messages]
(apply m1 true messages))
它会导致错误
; 语法错误编译于...; 无法获取宏的值
所以问题是如何将消息列表传递给可变参数宏?
你不能。宏在宏扩展时运行,并且在那里,
messages
只是一个符号。m1
根本不需要是一个宏——它可以是一个普通的函数。每当您可以使用函数而不是宏时,您绝对应该这样做以避免任何类似的问题。