¿Cuál es la diferencia entre '(a b c) y (lista' a 'b' c)?
-
07-07-2019 - |
Pregunta
Estoy leyendo " En lisp " y encontré este código (lo simplifiqué un poco).
CL-USER> (defun foo ()
'(a b c))
FOO
CL-USER> (foo)
(A B C)
CL-USER> (nconc * '(D E))
(A B C D E)
CL-USER> (foo)
(A B C D E)
CL-USER> (defun foo ()
(list 'a 'b 'c))
STYLE-WARNING: redefining FOO in DEFUN
FOO
CL-USER> (foo)
(A B C)
CL-USER> (nconc * '(D E))
(A B C D E)
CL-USER> (foo)
(A B C)
-
¿Qué significa exactamente
*
? ¿Es la llamada a la función anterior? ¿Es adecuado para usar en código del mundo real? -
¿Por qué
(nconc * '(D E))
cambia el valor de retorno de la primera funciónfoo
? -
Siempre pensé que
(list 'a' b 'c)
y' (a b c)
son lo mismo. ¿Cuál es la diferencia?
Solución
La llamada a LIST crea una nueva lista cada vez que se evalúa. El literal de la lista puede colocarse en un segmento de memoria de solo lectura después de la compilación. Una actualización destructiva en las listas con NCONC es problemática, posiblemente con consecuencias indefinidas (error de segmentación, cambio del literal para futuras referencias, o nada en absoluto).
Otros consejos
Las variables *
, **
y ***
están especificadas por el idioma estándar y son bastante útiles al probar cosas. Son una característica de REPL, por lo que no son, y no se supone, útiles en un " código del mundo real " ;.