当我们在宏扩展时评估关键字访问在Clojure中的行为时,我有点困惑。
以下按预期工作:
(def m {:a 1})
(:a m)
=> 1
然而,相同的关键字访问似乎不适用于宏:
(def m {:a 1})
(defmacro get-a [x] (:a x))
(get-a m)
=> nil
知道这里发生了什么吗?
答案 0 :(得分:8)
你应该考虑到宏不会评估他们的论点,除非你告诉他们。在你的版本中,get-a获得一个符号m,结果不是代码,它是关键字:a在符号中查找自己,这显然是零。但是这有用:
(defmacro get-a [x] `(:a ~x))
使用参数m调用此宏的结果是表达式'(:a m)',在您的上下文中计算结果为1。