5

实际上,我正在尝试完全理解 clojure,尤其是符号

(def a 1)
(type a)
;;=>java.lang.Long
(type 'a)
;;=>clojure.lang.Symbol

我知道这type是一个函数,所以它的参数首先被评估,所以我完全理解为什么上面的代码会这样工作。在流动的代码中,我决定使用宏来延迟评估

 (defmacro m-type [x] (type x))
 (m-type a)
 ;;==>clojure.lang.Symbol

我对此很好,但我无法理解的是:

 (m-type 'a)
 ;;=>clojure.lang.Cons

为什么'a的类型是缺点

4

1 回答 1

6

字符 ' 被 clojure 阅读器解释为一个阅读器宏,它扩展为一个列表,该列表包含符号quote后跟 ' 后面的任何内容,因此在您对(m-type 'a)the的调用'a中扩展为:

user> (macroexpand-1 ''a)
(quote a) 

然后调用列表上的类型,(quote a)这是一个缺点。

如果我们让 m-type 宏在评估时打印参数,这可能会更清楚一点:

user> (defmacro m-type [x] (println "x is " x) (type x))
#'user/m-type
user> (m-type 'a)
x is  (quote a)
clojure.lang.Cons  
于 2014-01-23T17:35:51.873 回答