setcdr ¶setcdr 函数与 setcar 函数类似,区别在于它替换列表的第二个及后续元素,而非第一个元素。
(若想了解如何修改列表的最后一个元素,可提前参阅 The kill-new function,该函数同时使用了 nthcdr 和 setcdr。)
要观察其工作方式,先执行下面的表达式,将变量设为家养动物列表:
(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)。