Macros 用clojure语言说什么<';a>;真的是
事实上,我试图完全理解clojure,尤其是符号Macros 用clojure语言说什么<';a>;真的是,macros,clojure,symbols,cons,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 '
(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”的类型是consclojure reader将字符“解释为一个reader宏,该宏扩展为一个列表,其中包含符号
quote
,后面跟的是,”,因此在调用(m-type“a)
时,'a
扩展为:
user> (macroexpand-1 ''a)
(quote a)
然后调用列表上的类型(引号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
我认为OP仍然会被(类型“a”-没有宏的调用-的结果弄糊涂。这是一个好的观点,在这一点上既有宏扩展又有引用。他很可能会再次问为什么(类型“a”)返回clojure.lang.Symbol。但我不是魔术师!我不是一个OP,我知道itUser投了“太广泛”的票,你能证明你的决定是正确的吗?这有一个具体而简单的答案也许有人只是读了标题?