Sto provando a passare un elenco a una funzione in Lisp e modificare il contenuto di tale elenco all'interno della funzione senza influire sull'elenco originale. Ho letto che Lisp è un valore pass-by, ed è vero, ma c'è qualcos'altro che non capisco. Ad esempio, questo codice funziona come previsto:In Common-Lisp, come posso modificare parte di un parametro di elenco da una funzione senza modificare l'elenco originale?
(defun test()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf n '(x y z))
n)
Se si chiama (test), la stampa (a b c) anche se (modifica) restituisce (x y z).
Tuttavia, non funziona in questo modo se si tenta di modificare solo una parte dell'elenco. Presumo che questo abbia qualcosa a che fare con liste che hanno lo stesso contenuto uguale in memoria ovunque o qualcosa del genere? Ecco un esempio:
(defun test()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf (first n) 'x)
n)
Quindi (prova) stampa (x b c). Quindi, come posso modificare alcuni elementi di un parametro di elenco in una funzione, come se quell'elenco fosse locale per quella funzione?
Si noti che le conseguenze della modifica delle costanti letterali non sono definite. Non farlo. Mai. '(a b c) è una costante letterale nel codice. Non dovresti modificarlo. È possibile modificare gli elenchi creati con la funzione LIST come (lista 'a' b 'c). –
notare inoltre che (SETF originale '(a b c)) non ha senso. SETF non introduce variabili.la variabile 'originale' non è definita da nessuna parte. Puoi impostare le variabili che sono state introdotte tramite LET, DEFUN, DEFVAR, DEFPARAMETER, ... –