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ón foo ?

  • Siempre pensé que (list 'a' b 'c) y ' (a b c) son lo mismo. ¿Cuál es la diferencia?

¿Fue útil?

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 " ;.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top