【发布时间】:2014-01-03 13:36:51
【问题描述】:
为什么会这样:
`(def ^:private name 1 )
评估为:
(def namespace/name 1)
而不是这个:
(def ^:private namespace/name 1)
我只是想写一个小宏:
(defmacro def- [name val] `(def ^:private ~name ~val))
但它扩展为:
(macroexpand-1 `(def- foo 12))
=> (def namespace/foo 12)
【问题讨论】:
-
你知道元数据是如何工作的吗?
-
不抱歉,也许我应该这样挖,谢谢
-
我可能错了,但我认为你需要
with-meta。 clojure.github.io/clojure/clojure.core-api.html#clojure.core/… -
你应该使用
macroexpand-1的常规引用;有了它,您的调用变为(macroexpand-1 '(def- foo 12)),它返回(def foo 12)的实际扩展。使用反引号,得到宏扩展的形式是(namespace/def- namespace/foo 12);正是这种形式扩展为(def namespace/foo 12),这是一个错误(传递给def的“名称”符号可能不是命名空间限定的)。元数据问题如 kotarak 对the question linked to be Guillermo 的回答中所述。
标签: clojure