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?