No common-lisp, como modifico parte de um parâmetro de lista de dentro de uma função sem alterar a lista original?

Eu estou tentando passar uma lista para uma função em Lisp e alterar o conteúdo dessa lista dentro da função sem afetar a lista original. Eu li que Lisp é pass-by-value, e é verdade, mas há algo mais acontecendo que eu não entendo muito bem. Por exemplo, esse código funciona conforme o esperado:

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

Se você chamar (teste), ele imprime (a b c), embora (modificar) retorne (x y z).

No entanto, não funciona assim se você tentar alterar apenas parte da lista. Eu suponho que isso tem algo a ver com listas que têm o mesmo conteúdo sendo o mesmo na memória em todos os lugares ou algo assim? Aqui está um exemplo:

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

Então (teste) imprime (x b c). Então, como eu altero alguns elementos de um parâmetro de lista em uma função, como se essa lista fosse local para essa função?

questionAnswers(4)

yourAnswerToTheQuestion