Clojure 如何在defmacro中保留元标记
如何定义宏来保存元数据信息Clojure 如何在defmacro中保留元标记,clojure,Clojure,如何定义宏来保存元数据信息 (defmacro defdynamic [name val] (let [dname (symbol (str "*" name "*"))] `(def ^:dynamic ~dname ~val))) (defdynamic hello 1) 将发出警告: Warning: *hello* not declared dynamic and thus is not dynamically rebindable, but its name sug
(defmacro defdynamic
[name val]
(let [dname (symbol (str "*" name "*"))]
`(def ^:dynamic ~dname ~val)))
(defdynamic hello 1)
将发出警告:
Warning: *hello* not declared dynamic and thus is not dynamically
rebindable, but its name suggests otherwise. Please either indicate
^:dynamic *hello* or change the name.
风险价值也不会是动态的
(:dynamic (meta #'*hello*))
=> nil
你在错误的地方应用了meta
(defmacro defdynamic
[name val]
(let [dname (-> (str "*" name "*")
(symbol)
(with-meta {:dynamic true}))]
`(def ~dname ~val)))
^:dynamic~dname
不起作用,因为它等效于
(带meta(unquote dname){:dynamic true})
。所以meta应用于取消引用本身,而不是最终结果。sweet。有什么区别?(除了显而易见的一个有效,另一个无效)。例如,它为什么工作?也就是说,为什么不工作:`(def~ ^:dynamic dname~val)@zcaudate Unquote导致对符号求值。符号上的元数据对其求值方式没有影响:它解析为它绑定到的任何对象。相反,您希望对符号求值(生成另一个符号),然后将新元数据附加到结果中