7.6 setcdr

setcdr函数类似于setcar函数,不同之处在于该函数替换列表的第二个及其后的元素,而不是第一个元素。

(要了解如何更改列表的最后一个元素,请查看kill-new 函数,该函数使用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)