Wspólnie-lisp, jak mogę zmodyfikować część parametru listy z funkcji bez zmiany oryginalnej listy?

Próbuję przekazać listę do funkcji w Lisp i zmienić zawartość tej listy w funkcji bez wpływu na oryginalną listę. Przeczytałem, że Lisp jest wartością „pass-by-value” i to prawda, ale dzieje się coś jeszcze, czego nie do końca rozumiem. Na przykład ten kod działa zgodnie z oczekiwaniami:

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

Jeśli zadzwonisz (przetestuj), drukuje (a b c), mimo że (modyfikuje) zwraca (x y z).

Jednak nie działa w ten sposób, jeśli spróbujesz zmienić tylko część listy. Zakładam, że ma to coś wspólnego z listami, które mają taką samą zawartość w pamięci wszędzie lub coś takiego? Oto przykład:

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

Następnie (test) drukuje (x b c). Jak więc zmienić niektóre elementy parametru listy w funkcji, tak jakby ta lista była lokalna dla tej funkcji?

questionAnswers(4)

yourAnswerToTheQuestion