repl得到答案:
> (cons 'quote '(a))
'a
在这里我认为它是如何得到正确答案的:
(缺点'引用'(a))---> (引用'a)---> “一
但我想知道为什么不是:
(缺点'引用'(a))---> (引用a)--->一个
cons定义是将第一个arg添加到第二个arg的第一个arg中。第二个arg是一个列表。
我也不明白为什么不能这样解释:
>'(a)
(a)
>(quote (a))
(a)
>'quote
quote
为什么不是: (缺点'引用'(a))---> (引用(a)) - > (a)中
答案 0 :(得分:2)
因此,(cons 'quote '(a))
的结果是(quote a)
(基准,而不是代码表达式)。因此'a
的结果是正确的。详细说明:
(cons 'quote '(a))
将基准quote
和(a)
汇总在一起,得到基准(quote . (a))
,与基准(quote a)
相同(即,包含两个符号quote
和a
)的列表。
(foo bar baz)
这样的列表,它与(foo . (bar baz))
,(foo . (bar . (baz)))
等相同。因此(quote a)
与(quote . (a))
实际上相同。 'a
是(quote a)
的读者简写,因此您的实施作者选择将其打印为'a
而不是(quote a)
。但两者都是正确的。但在你的帖子中,你提到了你的期望:
(缺点'引用'(a))---> (引用a)--->一个
第一部分是正确的。 (cons 'quote '(a))
评估为(quote a)
。但现在,这是一个数据,而不是代码表达式,因此不会再次进行评估。因此,除非您明确调用a
,否则它不会成为eval
。