Clojure中宏中关键字的奇怪行为

mik*_*era 4 macros clojure map keyword

在宏扩展时评估关键字访问在Clojure中的表现时,我有点困惑.

以下工作正如我所料:

(def m {:a 1})
(:a m)
=> 1 
Run Code Online (Sandbox Code Playgroud)

但是,相同的关键字访问似乎不适用于宏:

(def m {:a 1})
(defmacro get-a [x] (:a x))
(get-a m)
=> nil
Run Code Online (Sandbox Code Playgroud)

知道这里发生了什么吗?

Mic*_*ent 8

您应该考虑到宏不会评估他们的参数,除非您告诉他们.在你的版本中,get-a得到一个符号m而结果不是代码,它是关键字:a在符号中查找自己,这显然是零.但这有效:

(defmacro get-a [x] `(:a ~x))
Run Code Online (Sandbox Code Playgroud)

使用参数m调用此宏的结果是表达式'(:am)',在您的上下文中计算结果为1.