Изменение элементов списка с помощью setcar
Изменение CAR ячейки конс выполняется с помощью setcar. При использовании на списке setcar заменяет один элемент списка другим элементом.
- Функция: setcar cons object
-
Эта функция сохраняет object в качестве нового CAR для cons, заменяя предыдущий CAR. Другими словами, она изменяет слот CAR для cons, чтобы он ссылался на object. Возвращает значение object. Например:
(setq x (list 1 2)) ⇒ (1 2)(setcar x 4) ⇒ 4x ⇒ (4 2)
Когда ячейка конс является частью общей структуры нескольких списков, сохранение нового CAR в конс изменяет один элемент в каждом из этих списков. Вот пример:
;; Create two lists that are partly shared.
(setq x1 (list 'a 'b 'c))
⇒ (a b c)
(setq x2 (cons 'z (cdr x1)))
⇒ (z b c)
;; Replace the CAR of a shared link. (setcar (cdr x1) 'foo) ⇒ foo x1 ; Both lists are changed. ⇒ (a foo c) x2 ⇒ (z foo c)
;; Replace the CAR of a link that is not shared. (setcar x1 'baz) ⇒ baz x1 ; Only one list is changed. ⇒ (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----
| | |
--------------
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Setcar.html