Wie ändere ich in common-lisp einen Teil eines Listenparameters innerhalb einer Funktion, ohne die ursprüngliche Liste zu ändern?

Ich versuche, eine Liste an eine Funktion in Lisp zu übergeben und den Inhalt dieser Liste innerhalb der Funktion zu ändern, ohne die ursprüngliche Liste zu beeinflussen. Ich habe gelesen, dass Lisp ein vorübergehender Wert ist, und das stimmt, aber es gibt noch etwas, das ich nicht ganz verstehe. Dieser Code funktioniert beispielsweise wie erwartet:

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

Wenn Sie (test) aufrufen, wird (a b c) ausgegeben, obwohl (modify) (x y z) zurückgibt.

Dies funktioniert jedoch nicht, wenn Sie versuchen, nur einen Teil der Liste zu ändern. Ich nehme an, das hat etwas mit Listen zu tun, deren Inhalt überall gleich ist oder so? Hier ist ein Beispiel:

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

Dann druckt (Test) (x b c). Wie ändere ich also einige Elemente eines Listenparameters in einer Funktion, als ob diese Liste für diese Funktion lokal wäre?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage