Estoy tratando de pasar una lista a una función en Lisp, y cambiar el contenido de esa lista dentro de la función sin afectar la lista original. He leído que Lisp es de pasada, y es cierto, pero hay algo más que no entiendo del todo. Por ejemplo, este código funciona como se esperaba:En common-lisp, ¿cómo modifico parte de un parámetro de lista dentro de una función sin cambiar la lista original?
(defun test()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf n '(x y z))
n)
Si llama (prueba), se imprime devuelve (a b c) a pesar de que (modificar) (x y z).
Sin embargo, no funciona de esa manera si intenta cambiar solo una parte de la lista. Supongo que esto tiene algo que ver con las listas que tienen el mismo contenido siendo el mismo en la memoria en todas partes o algo así. Aquí hay un ejemplo:
(defun test()
(setf original '(a b c))
(modify original)
(print original))
(defun modify (n)
(setf (first n) 'x)
n)
Luego imprime (prueba) (x b c). Entonces, ¿cómo puedo cambiar algunos elementos de un parámetro de lista en una función, como si esa lista fuera local para esa función?
Tenga en cuenta que las consecuencias de modificar las constantes literales no están definidas. No hagas eso. Nunca. '(a b c) es una constante literal en tu código. No deberías modificarlo. Puede modificar listas que se crean con la función LIST like (lista 'a' b 'c). –
también tenga en cuenta que (SETF original '(a b c)) no tiene sentido. SETF no introduce variables.la variable 'original' no está definida en ninguna parte. Puede establecer variables que se han introducido a través de LET, DEFUN, DEFVAR, DEFPARAMETER, ... –