到底什么是Common Lisp的缺点细胞的定义是什么? 如何是一个缺点电池比标准链接列表项不同? 毕竟,无论是利弊细胞和链接的列表项有一个值和指向下一个单元格或项目......或者这是理解错了吗?
Answer 1:
缺点细胞一般容纳两个指针,可以指向任何东西。 当然一般用法是指一“值”与左之一,并且另一个缺点小区(或无)与“右”之一。
Answer 2:
一个cons细胞比链表节点更接近一个二叉树节点。 汽车和CDR返回两个孩子,可以是零,原子,或其他缺点的细胞。
Answer 3:
在Lisp中,一个cons单元持有的一对值。 如果cons单元是在可变c
,然后(car c)
返回所述第一值和(cdr c)
返回的第二个。
按照惯例,一个列表由缺点细胞,其中car
的电池的包含节点值和所述cdr
包含参考下一个节点或零(空列表),以指示该列表的末尾。 当原始函数返回或接受列表,这是在其中显示的列表格式。
因此,对于该列表l
, (car l)
给出的第一个元素(在第一cons单元的值)和(cdr l)
返回列表的尾部(在列表中的下一cons单元)。
Answer 4:
一个cons
细胞是由合同的三分之一cons
, car
,和cdr
,与要求是它们表现为对,如其他人所说。
之所以从这个定义留下了两个字“参考”,“指针”等,是认识到这些是实现细节。 如果你愿意,你可以建立一个cons
凭空作为阿伯尔森和萨斯曼做的:
(define (cons a b) (lambda (x) (x a b)))
(define (car x) (x (lambda (a b) a)))
(define (cdr x) (x (lambda (a b) b)))
这个定义完全是生活的Lisp世界的定义和功能里面,甚至不停下来考虑的对象是否被存储为值或引用; 然而,这些可以作为一个下拉更换为基本对象(不考虑可变性或其他特殊用途)。
Answer 5:
我认为其他的答案在这里,而准确,不明确的一两件事。
在传统的C ++链表的实现,这两个领域( val
和next
,说)的类型 。 next
被定义为指向列表中的另一个节点, null
被终止。 你不能指向任何东西,但与另一个节点next
。
的Lisp是动态类型,所以,在cons单元或者字段可以是任何 (无论是一个原子或一参考)。 您可以实现与利弊细胞链表(这是所有Lisp的列表是:利弊细胞与链nil
终止),但你也可以把任意值在各个领域,使用cons单元为坐标对,树节点等
你甚至可以将这些; 例如,清单x
y
坐标:
;; (cons foo (cons bar nil)) == (list foo bar)
(cons
(cons 5 4)
(cons (cons 9 10) nil))
=>
((5 . 4) (9 . 10))
甲cons单元因此比一个链接列表节点严格更一般; 它更接近一个“应用对”,可以这么说。 所有的标准列表处理功能( map
, dolist
等)仅仅是假设你把价值观功能car
和另一个列表中cdr
。
这一切都意味着-如果你想-你可以反向定义列表,其中car
指向下一个利弊细胞和cdr
指向的值! 要做到这一点有一个链表节点,你不得不重新定义类或数据结构来改变类型。