5.6.1 Изменение элементов списка с помощью setcar

Изменение CAR ячейки конса выполняется с помощью setcar. При использовании на списке setcar заменяет один элемент списка другим элементом.

Функция: setcar cons объект

Эта функция сохраняет объект как новый CAR cons, заменяя его предыдущий CAR. Другими словами, она изменяет слот CAR cons, чтобы он указывал на объект. Она возвращает значение объект. Например:

(setq x (list 1 2))
     ⇒ (1 2)
(setcar x 4)
     ⇒ 4
x
     ⇒ (4 2)

Когда ячейка конса является частью общей структуры нескольких списков, сохранение нового CAR в консе изменяет один элемент каждого из этих списков. Вот пример:

;; Создаем два частично общих списка.
(setq x1 (list 'a 'b 'c))
     ⇒ (a b c)
(setq x2 (cons 'z (cdr x1)))
     ⇒ (z b c)

;; Заменяем CAR общего звена.
(setcar (cdr x1) 'foo)
     ⇒ foo
x1                           ; Оба списка изменены.
     ⇒ (a foo c)
x2
     ⇒ (z foo c)

;; Заменяем CAR звена, которое не является общим.
(setcar x1 'baz)
     ⇒ baz
x1                           ; Изменен только один список.
     ⇒ (baz foo c)
x2
     ⇒ (z foo c)

Вот графическое представление общей структуры двух списков в переменных x1 и x2, показывающее, почему замена b изменяет их оба:

        --- ---        --- ---      --- ---
x1---> |   |   |----> |   |   |--> |   |   |--> nil
        --- ---        --- ---      --- ---
         |        -->   |            |
         |       |      |            |
          --> a  |       --> b        --> c
                 |
       --- ---   |
x2--> |   |   |--
       --- ---
        |
        |
         --> z

Вот альтернативная форма блочной диаграммы, показывающая ту же взаимосвязь:

x1:
 --------------       --------------       --------------
| car   | cdr  |     | car   | cdr  |     | car   | cdr  |
|   a   |   o------->|   b   |   o------->|   c   |  nil |
|       |      |  -->|       |      |     |       |      |
 --------------  |    --------------       --------------
                 |
x2:              |
 --------------  |
| car   | cdr  | |
|   z   |   o----
|       |      |
 --------------