Lisp Cons Cell的定义是什么?

λ J*_*kas 12 lisp linked-list common-lisp

Common Lisp Cons Cell的定义究竟是什么?Cons Cell如何与标准链表项不同?毕竟,cons单元格和链接列表项都有一个值和指向下一个单元格或项目的指针......或者这种理解是错误的吗?

Zed*_*Zed 20

缺点单元格通常包含两个指向任何东西的指针.一般用法当然是指左边的一个"值",另一个指向另一个具有"右"的Cons单元格(或nil).

  • cons单元也可以直接保存值,而无需保持指针.由(缺点1 2)制成的ac cons单元将具有指向数字的指针,但是可以直接存储它们(对于诸如字符的一些其他小项目也是如此). (8认同)

Jim*_*wis 14

cons单元比链表节点更靠近二叉树节点.汽车和cdr返回两个孩子,可以是零,原子或其他利弊细胞.

  • 为了强调这里的区别,不要求第二个元素必须是另一个cons单元格.`('豆腐.1)`是一个有效的利弊细胞. (7认同)

ReW*_*ite 7

在Lisp中,cons单元格拥有一对值.如果cons单元格在变量中c,则(car c)返回第一个值并(cdr c)返回第二个值.

按照惯例,列表由cons单元组成,其中car单元格包含节点值,并且cdr包含对下一个节点的引用或nil(空列表)以指示列表的结尾.当基元函数返回或接受列表时,这是显示列表的格式.

因此,对于列表l,(car l)给出第一个元素(第一个cons单元格中的值)并(cdr l)返回列表的尾部(列表中的下一个cons单元格).


Jos*_*Lee 6

cons细胞是由以下组成的合同的三分之一cons,car以及cdr,与所述的要求是它们表现为对,如其他人提及.

从该定义中省略"引用","指针"等词语的原因是要认识到那些是实现细节.如果你愿意的话,你可以cons凭借Abelson和Sussman所做的那样凭空捏造:

(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)))
Run Code Online (Sandbox Code Playgroud)

这个定义完全存在于Lisp的定义和函数世界中,甚至不停止考虑对象是存储为值还是引用; 然而,这些可以作为原始对象的替代品(不考虑可变性或其他特殊用途).