Jos*_*son 3 lisp cons land-of-lisp
> (cons 2 3)
(2 . 3)
Run Code Online (Sandbox Code Playgroud)
Lisp环境只需要分配一个cons单元来连接这两个项目.
以上是来自Lisp的书"Land of Lisp".我不明白为什么这对只位于一个cons单元格中.这些数据的内存是什么样的?
Sva*_*nte 12
一个cons细胞始终存放着两个值,称为car和cdr:
+-----+-----+
| car | cdr |
+-----+-----+
Run Code Online (Sandbox Code Playgroud)
为了表示一个利弊细胞,Lisp有"点符号":
(car . cdr)
Run Code Online (Sandbox Code Playgroud)
该函数cons从其两个参数创建这样的cons单元:
(cons 1 2)
=> (1 . 2)
Run Code Online (Sandbox Code Playgroud)
这可以被认为是这样的:
+-----+-----+
| 1 | 2 |
+-----+-----+
Run Code Online (Sandbox Code Playgroud)
cons单元的值也可以是其他东西的"引用"或"指针".例如,其他东西可以是其他缺点:
+-----+-----+ +-----+-----+
| 1 | ------->| 2 | nil |
+-----+-----+ +-----+-----+
Run Code Online (Sandbox Code Playgroud)
这将是(1 . (2 . nil))点符号.此链接在Lisp中用于表示列表.由于列表用于表示代码,因此它们对于Lisp很重要.因此,它们有一个较短的符号:(1 2).
CONS单元是具有两个字段的记录.
在许多Lisp实现中,对cons单元进行了特殊优化.典型的一个是,fixnum数字直接存储在字段中 - 没有指针.只要数据适合存储器,就可以直接存储它们.例如,这也可以是字符的情况.还可以存储具有两个字符的cons单元,使得字符被编码到字段中.
对于其他更大的数据,存在指向存储在cons单元中的数据的指针.
然后还要注意区别:
(cons 1 2)
Run Code Online (Sandbox Code Playgroud)
和
(list 1 2)
Run Code Online (Sandbox Code Playgroud)
(cons 1 2)创建一个单一的cons单元格.(list 1 2)创造两个利弊细胞.第一个cons单元格包含1和指向第二个单元格的指针.第二个cons单元格包含2和NIL(列表标记的结尾).
因此,作为优化,通常在键/值对中仅使用cons单元而不是列表.
((age . 22) (name . "Barbara))
Run Code Online (Sandbox Code Playgroud)
与
((age 22) (name "Barbara"))
Run Code Online (Sandbox Code Playgroud)
后者使用两个以上的利弊细胞.