【发布时间】:2019-11-18 09:58:37
【问题描述】:
我想编写一个宏 sym-def,它的行为与特殊形式 def 相同,但使用 (symbol "c") 作为第一个参数。
我的第一步是
(def (symbol "c") 4)
但这返回了错误First argument to def must be a Symbol。
我的第二步是
(eval `(def ~(symbol "c") 4))
这成功地将c 定义为全局环境中的4。
为什么我的第一步失败了,而第二步成功了?
最后,我尝试编写所需的宏
(defmacro sym-def [sym value] `(def ~sym ~value))
但这有一个“坏”macroexpand
(macroexpand '(sym-def (symbol "c") 4)) => (def (symbol "c") 4)
这样
(sym-def (symbol "c") 4)
失败并出现与我第一步相同的错误。
编写宏的正确方法是什么?
【问题讨论】: