小编cfg*_*uss的帖子

是否有一个等效于def的Clojure宏?

我想编写一个宏,sym-def该宏具有与特殊形式相同的行为,def但是使用(symbol "c"),例如,作为第一个参数。

我的第一步是

(def (symbol "c") 4)
Run Code Online (Sandbox Code Playgroud)

但这返回了错误First argument to def must be a Symbol

我的第二步是

(eval `(def ~(symbol "c") 4))
Run Code Online (Sandbox Code Playgroud)

c在全球环境中成功将其定义为4。为什么第二步成功却第一步失败了?

最后,我尝试编写所需的宏

(def (symbol "c") 4)
Run Code Online (Sandbox Code Playgroud)

但这有一个“坏” macroexpand

(eval `(def ~(symbol "c") 4))
Run Code Online (Sandbox Code Playgroud)

以便

(defmacro sym-def [sym value] `(def ~sym ~value))
Run Code Online (Sandbox Code Playgroud)

失败,出现与我第一步相同的错误。

编写宏的正确方法是什么?

macros function clojure

2
推荐指数
1
解决办法
134
查看次数

标签 统计

clojure ×1

function ×1

macros ×1