В 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)

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