为什么cons的嵌套应用程序构造不正确的列表?

时间:2014-07-24 21:30:16

标签: list scheme racket cons

cons的嵌套应用程序构造不正确的列表是什么? 我正在学习计划并对cons感到困惑。我遇到了这个答案:

Cons element to list vs cons list to element in Scheme

我知道当cons的第二个参数是一个列表时,它会将第一个参数添加到列表的头部

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

以下对对我有意义:

(cons 2 3); 2.3 pair

但是,我不明白为什么以下表达式会构造一个不正确的列表

(cons 1 (cons 2 3))
=> '(1 2 . 3)   ; an improper list

我无法通过上面的表达式可视化出现的内容

你能详细说明吗?

1 个答案:

答案 0 :(得分:4)

您遇到的困惑并不是唯一的。它只是符号,就是这一切,直到你学会看到这种符号,一切都让人困惑。

首先,让我们从适当的列表开始。这些列表以空列表结尾:

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

此列表(1 2 3)实际上是(1 2 3 . ())的简写:基本上是最后一个缺点指向空列表的列表。

现在,如果我们将()替换为4,那么让我们看看我们得到了什么:

(cons 1 (cons 2 (cons 3 4)))
; => (1 2 3 . 4)

注意,它与(1 2 3 . ())没那么不同,是吗?

当然,对于更长时间的(1 . (2 . (3 . ())))(1 . (2 . (3 . 4))),这两者都是缩写。