用来修改cdr的最底层原子函数是cdr。
此函数将object作为cons新的cdr进行存储,替换原来的cdr。换句话说, 它改变cons的cdr结构,让其指向object。它返回object的值。
下面是用一个新列表来替换列表的cdr的示例。因为要建立一个不同的元素序列,该列表除了第一个元素外的所有元素 都被移除。第一个元素未被修改,因为它保存在该列表的car中,不被cdr访问到。
(setq x '(1 2 3))
⇒ (1 2 3)
(setcdr x '(4))
⇒ (4)
x
⇒ (1 4)
你可以通过替换列表中cons cell的cdr来从列表中间删除元素。例如,这里我们通过修改第一个cons cell的cdr,
从列表(a b c)中删除第二个元素b。
(setq x1 '(a b c))
⇒ (a b c)
(setcdr x1 (cdr (cdr x1)))
⇒ (c)
x1
⇒ (a c)
下面是用盒式记法演示的结果:
--------------------
| |
-------------- | -------------- | --------------
| car | cdr | | | car | cdr | -->| car | cdr |
| a | o----- | b | o-------->| c | nil |
| | | | | | | | |
-------------- -------------- --------------
第二个曾经持有元素b的cons cell,仍然存在并且其car仍然是b,但它不是在该列
表的一部分。
同样地很容易通过改变cdr来插入新元素。
(setq x1 '(a b c))
⇒ (a b c)
(setcdr x1 (cons 'd (cdr x1)))
⇒ (d b c)
x1
⇒ (a d b c)
下面是用盒式记法演示的结果:
-------------- ------------- -------------
| car | cdr | | car | cdr | | car | cdr |
| a | o | -->| b | o------->| c | nil |
| | | | | | | | | | |
--------- | -- | ------------- -------------
| |
----- --------
| |
| --------------- |
| | car | cdr | |
-->| d | o------
| | |
---------------