Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 用clojure语言说什么<';a>;真的是_Macros_Clojure_Symbols_Cons - Fatal编程技术网

Macros 用clojure语言说什么<';a>;真的是

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 '

事实上,我试图完全理解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”的类型是cons

clojure 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投了“太广泛”的票,你能证明你的决定是正确的吗?这有一个具体而简单的答案也许有人只是读了标题?