7.6 setcdr

setcdr 函数与 setcar 函数类似,区别在于它替换列表的第二个及后续元素,而非第一个元素。

(若想了解如何修改列表的最后一个元素,可提前参阅 The kill-new function,该函数同时使用了 nthcdrsetcdr。)

要观察其工作方式,先执行下面的表达式,将变量设为家养动物列表:

(setq domesticated-animals (list 'horse 'cow 'sheep 'goat))

现在对该列表求值,会返回列表 (horse cow sheep goat)

domesticated-animals
     ⇒ (horse cow sheep goat)

接下来,对 setcdr 传入两个参数:值为列表的变量名,以及要设置为该列表 CDR 的新列表:

(setcdr domesticated-animals '(cat dog))

执行该表达式后,回显区会出现列表 (cat dog),这是函数的返回值。我们真正关心的是它的副作用,再次对变量 domesticated-animals 求值即可看到:

domesticated-animals
     ⇒ (horse cat dog)

可以看到,列表从 (horse cow sheep goat) 被修改为 (horse cat dog)。列表的 CDR(cow sheep goat) 变为了 (cat dog)