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导致对符号求值。符号上的元数据对其求值方式没有影响:它解析为它绑定到的任何对象。相反,您希望对符号求值(生成另一个符号),然后将新元数据附加到结果中