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

List 为什么cons的嵌套应用程序构造不正确的列表?,list,scheme,racket,cons,List,Scheme,Racket,Cons,cons的嵌套应用程序构造了什么不正确的列表? 我正在学习计划,对cons感到困惑。我找到了这个答案: 我知道当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的嵌套应用程序构造了什么不正确的列表? 我正在学习计划,对
cons
感到困惑。我找到了这个答案:

我知道当
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)
这个列表,
(1233)
,实际上是
(1233)()
:基本上是一个最后一个cons指向空列表的列表

现在,如果我们用4代替
()
,让我们看看我们得到了什么:

(cons 1 (cons 2 (cons 3 4)))
; => (1 2 3 . 4)
注意,它与
(1 2 3.()
)没有太大区别,是吗


当然,这两个词都是较长形式的
(1.(2.(3)()
(1.(2.(3.4))
的缩写。

你所经历的困惑并不是独一无二的。这只是一种符号,仅此而已,在你学会理解这种符号之前,一切都是混乱的

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

(cons 1 (cons 2 (cons 3 '())))
; => (1 2 3)
这个列表,
(1233)
,实际上是
(1233)()
:基本上是一个最后一个cons指向空列表的列表

现在,如果我们用4代替
()
,让我们看看我们得到了什么:

(cons 1 (cons 2 (cons 3 4)))
; => (1 2 3 . 4)
注意,它与
(1 2 3.()
)没有太大区别,是吗


当然,这两个词都是较长形式的
(1.(2.(3)()
(1.(2.(3.4))
的缩写。

这两个词的可能重复之处在于消费品的印刷方式,而
(1.(2.3))
通常以
(12.3)的形式印刷
。这可能与消费品的打印方式有关,
(1.(2.3))
通常打印为
(12.3)