cons的嵌套应用程序构造不正确的列表是什么?我正在学习方案,对cons
感到困惑。我偶然发现了这个答案:
Cons元素到列表vs Cons列表到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
我就是想不出上面的表达式是怎么回事
你能详细说明一下吗?你所经历的困惑并不是唯一的。它只是一个符号,仅此而已,在你学会看这个符号之前,一切都是令人困惑的。
首先,让我们从适当的列表开始。这些列表以空列表结束:
(cons 1 (cons 2 (cons 3 '())))
; => (1 2 3)
这个列表,(1 2 3)
,实际上是(1 2 3 . ())
的简写:基本上是一个列表,其中最后一个cons指向一个空列表。
现在,如果我们用4代替()
,让我们看看我们得到了什么:
(cons 1 (cons 2 (cons 3 4)))
; => (1 2 3 . 4)
注意,它和(1 2 3 . ())
并没有太大的不同,对吧?
当然,这两个都是(1 . (2 . (3 . ())))
和(1 . (2 . (3 . 4)))
的简写形式。