对计划中定义的缺点有点困惑

时间:2013-11-17 15:11:42

标签: scheme eval quote

repl得到答案:

> (cons 'quote '(a))
'a 

在这里我认为它是如何得到正确答案的:

(缺点'引用'(a))---> (引用'a)---> “一

但我想知道为什么不是:

(缺点'引用'(a))---> (引用a)--->一个

cons定义是将第一个arg添加到第二个arg的第一个arg中。第二个arg是一个列表。

我也不明白为什么不能这样解释:

>'(a)
(a)
>(quote (a)) 
(a)
>'quote
quote

为什么不是: (缺点'引用'(a))---> (引用(a)) - > (a)中

1 个答案:

答案 0 :(得分:2)

因此,(cons 'quote '(a))的结果是(quote a)(基准,而不是代码表达式)。因此'a的结果是正确的。详细说明:

  1. (cons 'quote '(a))将基准quote(a)汇总在一起,得到基准(quote . (a)),与基准(quote a)相同(即,包含两个符号quotea)的列表。
    • 请注意,对于(foo bar baz)这样的列表,它与(foo . (bar baz))(foo . (bar . (baz)))等相同。因此(quote a)(quote . (a))实际上相同。
  2. 由于'a(quote a)的读者简写,因此您的实施作者选择将其打印为'a而不是(quote a)。但两者都是正确的。
  3. 但在你的帖子中,你提到了你的期望:

      

    (缺点'引用'(a))---> (引用a)--->一个

    第一部分是正确的。 (cons 'quote '(a))评估为(quote a)。但现在,这是一个数据,而不是代码表达式,因此不会再次进行评估。因此,除非您明确调用a,否则它不会成为eval