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)
知道这里发生了什么吗?
您应该考虑到宏不会评估他们的参数,除非您告诉他们.在你的版本中,get-a得到一个符号m而结果不是代码,它是关键字:a在符号中查找自己,这显然是零.但这有效:
(defmacro get-a [x] `(:a ~x))
Run Code Online (Sandbox Code Playgroud)
使用参数m调用此宏的结果是表达式'(:am)',在您的上下文中计算结果为1.