语法 - 引用宏参数?

时间:2017-09-21 10:03:32

标签: clojure

我想将一个传递的参数语法引用到一个宏,但我无法理解它。所以给定一个宏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 <)
=> <

1 个答案:

答案 0 :(得分:2)

您可以使用clojure.core/resolve函数将符号解析为当前命名空间中的var 。 var对象包含原始符号的名称空间和名称。然后,您可以使用这些值构造一个新符号并将其返回。

(defmacro quote-it [a]
  (let [r (resolve a)]
    `'~(symbol (str (:ns (meta r))) (str (:name (meta r))))))