我想将一个传递的参数语法引用到一个宏,但我无法理解它。所以给定一个宏quote-it
和<
,我想得到
(quote-it <)
=> clojure.core/<
以下都没有作品:
(defmacro quote-it [a] `~a)
=> #'user/quote-it
(quote-it <)
=> #object[clojure.core$_LT_ 0x11c08900 "clojure.core$_LT_@11c08900"]
(defmacro quote-it [a] `'~a)
=> #'user/quote-it
(quote-it <)
=> <
答案 0 :(得分:2)
您可以使用clojure.core/resolve函数将符号解析为当前命名空间中的var 。 var对象包含原始符号的名称空间和名称。然后,您可以使用这些值构造一个新符号并将其返回。
(defmacro quote-it [a]
(let [r (resolve a)]
`'~(symbol (str (:ns (meta r))) (str (:name (meta r))))))