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

时间:2010-05-19 19:19:44

标签: map clojure macros keyword

当我们在宏扩展时评估关键字访问在Clojure中的行为时,我有点困惑。

以下按预期工作:

(def m {:a 1})
(:a m)
=> 1 

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

(def m {:a 1})
(defmacro get-a [x] (:a x))
(get-a m)
=> nil

知道这里发生了什么吗?

1 个答案:

答案 0 :(得分:8)

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

(defmacro get-a [x] `(:a ~x))

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