setcarИзменение CAR ячейки конса выполняется с помощью setcar. При использовании на списке setcar заменяет один элемент списка другим элементом.
Эта функция сохраняет объект как новый 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----
| | |
--------------