В Common-LISP, как я могу изменить часть параметра списка из функции без изменения исходного списка?

Я пытаюсь передать список функции в Лиспе и изменить содержимое этого списка в функции, не затрагивая исходный список. Я читал, что Lisp передается по значению, и это правда, но есть кое-что еще, что я не совсем понимаю. Например, этот код работает должным образом:

(defun test ()
    (setf original '(a b c))
    (modify original)
    (print original))
(defun modify (n)
    (setf n '(x y z))
    n)

Если вы вызываете (test), он печатает (a b c), даже если (modify) возвращает (x y z).

Однако это не сработает, если вы попытаетесь изменить только часть списка. Я предполагаю, что это как-то связано со списками, которые имеют одинаковый контент, везде одинаковы или что-то в этом роде? Вот пример:

(defun test ()
    (setf original '(a b c))
    (modify original)
    (print original))
(defun modify (n)
    (setf (first n) 'x)
    n)

Затем (тест) печатает (x b c). Итак, как мне изменить некоторые элементы параметра списка в функции, как если бы этот список был локальным для этой функции?

Ответы на вопрос(4)

Ваш ответ на вопрос