2010-06-11 83 views
5

我已经开始学习Scheme了,主要是为了好玩,因为我之前从未使用过一种功能性语言。我选择了Scheme,因为我想长时间阅读SICP为什么使用cons创建一对两个列表会产生一个列表和两个元素?

无论如何,我目前正在学习列表,在此之前,我了解了cons,car和cdr。还有的创建名单的有缺点的列表,像这样的例子:

(cons (list 1 2) (list 3 4)) 

结果列表是((1 2)3 4),这没有任何意义对我来说,我希望(( 1 2)(3 4))作为结果(由两个列表组成的列表)。为什么它的行为如此?我意识到,如果我要使用汽车,我会得到(1 2),而且我会得到(3 4)因为cdr总是返回“其余”,但我不明白为什么没有列出两个列表?

+1

这个问题稍有不同,但答案正好回答你的问题:http://stackoverflow.com/questions/2921912/in-sicp-exercise-2-26-using-drscheme-why-does-cons-return -a-list-instead-of-ap – 2010-06-11 12:11:39

+1

为什么当你早些时候用LIST列出一个列表时,你会用CONS列出一个列表?为什么不坚持使用LIST来制作列表? CONS和LIST不一样 - 这也是它们为什么是不同的功能的原因。 – 2010-06-11 12:16:53

+0

这是一个练习SICP – fingerprint211b 2010-06-11 12:17:56

回答

9

由于第一个参数cons是列表的第一个元素,第二个参数是一个包含其余元素(列表)的列表,因此第一个元素(汽车)为(1 2),其余为(cdr)(3 4)项目。

这非常类似于列表的结构:(正确)列表的每个节点都包含一个元素和一个包含所有其他元素的列表。 cons创建一个这样的节点。

如果cons的第二个参数将成为列表的第二个元素,那么如何创建一个带有三个参数的列表?您需要在此处制作cons变奏曲,它只是list的另一个名称。

如果要创建列表的列表,请使用(list (list 1 2) (list 3 4))

+0

谢谢,这有帮助。 – fingerprint211b 2010-06-11 12:25:40

+0

'(1 2)'是汽车,而不是cdr,'(3 4)'是cdr。 – Zorf 2010-06-16 03:40:05

+0

@Lajla:Bah,当然。固定。 – sepp2k 2010-06-16 08:53:46

1
list A: [ |  ] 
      1 [ | ] 
       2/

list B: [ |  ] 
      3 [ | ] 
       4/

====================== 

(cons A B) 

[   |   ] 
[ |  ] [ |  ] 
    1 [ | ]  3 [ | ] 
     2/  4/

内部结构的图形表示可以帮助我们看到问题。

,这将有助于更多一些:

[   |   ] 
    X  [ |  ] 
       3 [ | ] 
        4/

你看到的格局?以上是名单(X 3 4)。这就是(cons A B)仅将car部分作为单独列表而不是cdr的原因。

3
(list (list 1 2) 
     (list 3 4)) 

相同

(cons (list 1 2) 
     (cons (list 3 4) 
      '())) 

这导致

((1 2) (3 4)) 

其也可以写成

((1 . (2 .())) 
. 
((3 . (4 .())) 
    . 
())) 
0

由于利弊细胞是是两个元素的列表,两者经常混淆。如果(a . b)是cons单元,则(a . (b .()))是两个元素的列表。任何列表特别保证空列表是一个cons单元,其汽车字段包含第一个元素并且其cdr字段包含包含其余元素的列表。因此,列表只是一棵二叉树,其最右边的叶子是特殊常数()nil,具体取决于您的方言。

这就是为什么(cons 0 '(1 2 3))评估为(0 1 2 3),而不是(0 (1 2 3))我们创建了一个cons单元,其车是0,并且其CDR是(1 2 3),所以名单(0 1 2 3)

相关问题