题
我意识到这是一个总的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)