1

我试图了解对构造和表示。让我们看一下以下结果:

(length (cons '(a b) '(d e f)))
=> 4

现在让我们切换顺序:

(length (cons '(d e f) '(a b)))
 => 3

(length (car (cons '(d e f) '(a b))))
=> 3

你能解释一下上面的结果吗?汽车和cdr有什么区别?

4

1 回答 1

1

请记住,这cons只是将两件事粘在一起,由于历史原因,第一个被称为 ,car第二个被称为cdr.

如果第二个恰好是一个正确的列表,那么结果也是一个列表。因此,列表被定义为consing 一个元素的结果与 ing 一个元素的结果cons......等等,直到我们到达空列表'()。例如:

(cons 1 (cons 2 (cons 3 '())))
=> '(1 2 3)

在处理列表时,car将列表的第一个元素和cdr其余元素视为列表,并cons在列表的开头添加一个元素 - 该元素可以是任何东西,包括另一个列表。它只是被添加到头部,列表没有“合并”(我们使用append它)。看一看:

(car '(1 2 3))
 => 1

(cdr '(1 2 3))
=> '(2 3)

现在,关于您的示例 - 第一个添加'(a b)为列表的第一个元素,其余部分是'(d e f),所以我们现在有一个 4 元素列表,如下所示:

(cons '(a b) '(d e f))
=> '((a b) d e f)

与第二个示例类似:我们将第一个元素添加'(d e f)到其余元素'(a b)中,我们得到一个 3 元素列表:

(cons '(d e f) '(a b))
=> '((d e f) a b)

最后,如果我们调用car上面的列表,我们会得到它的第一个元素——恰好是'(d e f),很明显它有 3 个元素:

(car (cons '(d e f) '(a b)))
=> '(d e f)
于 2017-11-28T14:23:27.900 回答