实际上我试图完全理解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 的类型是缺点
字符 '被 clojure 阅读器解释为一个读取器宏,它扩展到一个包含符号的列表quote
后跟 ',因此在你调用(m-type 'a)
时,'a
扩展到:
user> (macroexpand-1 ''a)
(quote a)
然后在列表上调用类型(quote a)
这是一个缺点。
如果我们让 m 型宏打印它在评估时看到的参数,这可能会更清楚一些:
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