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
我无法通过上面的表达式可视化出现的内容
你能详细说明吗?答案 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)))
,这两者都是缩写。