在clojure语言中<'a>真的是

时间:2014-01-23 17:26:40

标签: macros clojure symbols cons

实际上,我试图完全理解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是一种缺点

的类型

1 个答案:

答案 0 :(得分:6)

字符'被clojure reader解释为reader-macro,它扩展为包含符号quote的列表,后跟''后面的任何内容,因此在调用(m-type 'a)'a 1}}正在扩展到:

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