【发布时间】:2010-05-19 19:19:43
【问题描述】:
在宏扩展时评估关键字访问在 Clojure 中的行为方式让我有些困惑。
以下工作如我所料:
(def m {:a 1})
(:a m)
=> 1
但是,在宏中似乎无法使用相同的关键字访问:
(def m {:a 1})
(defmacro get-a [x] (:a x))
(get-a m)
=> nil
知道这里发生了什么吗?
【问题讨论】:
标签: 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
知道这里发生了什么吗?
【问题讨论】:
标签: map clojure macros keyword
您应该考虑到宏不会评估它们的参数,除非您告诉它们。在您的版本中, get-a 得到一个符号 m ,结果不是代码,它是关键字 :a 在符号中查找自身,这显然是 nil。但是,这可行:
(defmacro get-a [x] `(:a ~x))
使用参数 m 调用此宏的结果是表达式 '(:a m)',它在您的上下文中计算为 1。
【讨论】: