我意识到这是一个总的n00b问题,但我很好奇,我想我可能会得到一个更好的解释,这里比其他地方。这里有一个列表(我使用计划博士)

> (list 1 2 3)
(1 2 3)

我认为这是刚刚糖这样的:

> (cons 1 (cons 2 (cons 3 null)))
(1 2 3)

此,在另一方面,不别的东西:

> (cons 1 (cons 2 3))
(1 2 . 3)

我的问题是,为什么不同?什么是需要空在列表的末尾点?

有帮助吗?

解决方案

列表的定义是递归的。

 1. The null list (empty list) is a list
 2. A list is made up of an item cons a list

因此,这些都是列表:

1. null  => ()  --read as empty list
2. cons 3 null  =>  (3)
3. cons2 (cons 3 null)  => (2, 3) 

在最后一个例子,你给缺点2 3不符合这个列表定义所以它不是一个列表。这是利弊接受一个项目和一个列表。 3是不是列表。

其他提示

cons增加了一个新元素到列表的开头,所以你在做什么,当你写的:

(cons 1 (cons 2 (cons 3 null)))

递归地将项目添加到不断增长的列表,从null,其被定义为在空列表 ()。当你调用(cons 2 3)你不开始与空单开始,所以不会被追加2至其开始构建一个列表。

的Lisp,包括方案,是动态类型,而“口齿不清方式”为具有超过一个单个数据结构的许多功能,而不是不同的数据结构不同的任务。

所以这个问题:“什么是需要空在列表的最后的点?”是不是很正确的问。

cons函数不需要你给一个cons对象或nil作为它的第二个参数。如果第二个参数不是cons对象或nil,那么你得到一对,而不是一个列表,并使用列表格式,但有一个点运行时并不打印。

所以,如果你想建造的东西它的形状像一个名单,然后给cons列表作为其第二个参数。如果你想别的东西构造,然后给cons别的东西作为它的第二个参数。

如果希望在它具有恰好两个值的数据结构

对是有用的。有一对,你不需要零末,以纪念它的长度,所以它的效率更好。对列表是一个简单的实现地图一键价值的;共同口齿不清具有功能以支持诸如属性列表作为其标准库的一部分。

所以,真正的问题是“你为什么能构造两对并列出与同cons功能?”,答案是“为什么有两个数据结构时,你只需要一个?”

一个缺点语句用来分配一对他的车子OBJ1和其CDR是OBJ2

(cons obj1 obj2)

因此,有必要结束利弊语句空,让我们知道我们是在列表的末尾。

> (cons 1 (cons 2 3))
(1 2 . 3)

在该示例中,CDR是一对<2,3>其中2为汽车和3是CDR。不一样:

(list 1 2 3)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top