为什么你必须使用null来获得一个正确的方案列表?

dsi*_*ard 5 scheme racket

我意识到这是一个总的n00b问题,但我很好奇,我想我可能会在这里获得比其他任何地方更好的解释.这是一个列表(我正在使用Dr. Scheme)

> (list 1 2 3)
(1 2 3)
Run Code Online (Sandbox Code Playgroud)

我认为这只是糖:

> (cons 1 (cons 2 (cons 3 null)))
(1 2 3)
Run Code Online (Sandbox Code Playgroud)

另一方面,这做了其他事情:

> (cons 1 (cons 2 3))
(1 2 . 3)
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么会有所不同?要求列表末尾的空值有什么意义?

Vin*_*nie 11

列表的定义是递归的.

 1. The null list (empty list) is a list
 2. A list is made up of an item cons a list
Run Code Online (Sandbox Code Playgroud)

所以这些是列表:

1. null  => ()  --read as empty list
2. cons 3 null  =>  (3)
3. cons2 (cons 3 null)  => (2, 3) 
Run Code Online (Sandbox Code Playgroud)

您给出的最后一个示例2 3不符合此列表定义,因此它不是列表.这是缺点接受一个项目和一个列表.3不是清单.