Изменение CDR списка
Наименее сложный способ изменения CDR — setcdr:
- Функция: setcdr cons object
Эта функция сохраняет object в качестве нового CDR объекта cons, заменяя предыдущий CDR. Другими словами, она изменяет слот CDR объекта cons на указание на объект object. Она возвращает значение object.
Вот пример замены CDR списка другим списком. Все элементы списка, кроме первого, удаляются в пользу другой последовательности элементов. Первый элемент не изменяется, потому что он находится в CAR списка и не достижим через CDR.
(setq x (list 1 2 3))
⇒ (1 2 3)
(setcdr x '(4))
⇒ (4)
x
⇒ (1 4)
Вы можете удалить элементы из середины списка, изменив CDR ячеек cons в списке. Например, здесь мы удаляем второй элемент, b, из списка (a b c), изменив CDR первой ячейки cons:
(setq x1 (list 'a 'b 'c))
⇒ (a b c)
(setcdr x1 (cdr (cdr x1)))
⇒ (c)
x1
⇒ (a c)
Вот результат в виде блочной записи:
--------------------
| |
-------------- | -------------- | --------------
| car | cdr | | | car | cdr | -->| car | cdr |
| a | o----- | b | o-------->| c | nil |
| | | | | | | | |
-------------- -------------- --------------
Вторая ячейка cons, которая ранее содержала элемент b, по-прежнему существует, и ее CAR по-прежнему b, но она больше не является частью этого списка.
Также легко вставить новый элемент, изменив CDR:
(setq x1 (list 'a 'b 'c))
⇒ (a b c)
(setcdr x1 (cons 'd (cdr x1)))
⇒ (d b c)
x1
⇒ (a d b c)
Вот результат в виде блочной записи:
-------------- ------------- -------------
| car | cdr | | car | cdr | | car | cdr |
| a | o | -->| b | o------->| c | nil |
| | | | | | | | | | |
--------- | -- | ------------- -------------
| |
----- --------
| |
| --------------- |
| | car | cdr | |
-->| d | 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/Setcdr.html