Next: , Previous: Setcar, Up: 修改列表


5.6.2 替换列表的CDR

用来修改cdr的最底层原子函数是cdr

— Function: setcdr cons object

此函数将object作为cons新的cdr进行存储,替换原来的cdr。换句话说, 它改变conscdr结构,让其指向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------
             |       |       |
              ---------------