En common-lisp, ¿cómo modifico parte de un parámetro de lista desde dentro de una función sin cambiar la lista original?

Estoy tratando de pasar una lista a una función en Lisp, y cambiar el contenido de esa lista dentro de la función sin afectar la lista original. He leído que Lisp es valor de paso, y es cierto, pero hay algo más en juego que no entiendo muy bien. Por ejemplo, este código funciona como se esperaba:

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

Si llama (prueba), imprime (a b c) aunque (modificar) devuelve (x y z).

Sin embargo, no funciona de esa manera si intenta cambiar solo parte de la lista. ¿Supongo que esto tiene algo que ver con listas que tienen el mismo contenido igual en la memoria en todas partes o algo así? Aquí hay un ejemplo:

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

Luego (prueba) imprime (x b c). Entonces, ¿cómo cambio algunos elementos de un parámetro de lista en una función, como si esa lista fuera local para esa función?

Respuestas a la pregunta(4)

Su respuesta a la pregunta