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?