Qual è la differenza tra '(a b c) e (list' a 'b' c)?
-
07-07-2019 - |
Domanda
Sto leggendo " On lisp " e ho riscontrato questo codice (l'ho semplificato un po ').
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)
-
Cosa significa esattamente
*
? È la precedente chiamata di funzione? È adatto per l'uso nel codice del mondo reale? -
Perché
(nconc * '(D E))
modifica il valore di ritorno della prima funzionefoo
? -
Ho sempre pensato che
(lista 'a' b 'c)
e' (a b c)
sono uguali? Qual è la differenza?
Soluzione
La chiamata a ELENCO crea un nuovo elenco ogni volta che viene valutata. L'elenco letterale potrebbe essere inserito in un segmento di memoria di sola lettura dopo la compilazione. Un aggiornamento distruttivo sugli elenchi con NCONC è quindi problematico, probabilmente con conseguenze indefinite (errore di segmentazione, modifica del valore letterale per riferimenti futuri o nulla).
Altri suggerimenti
Le variabili *
, **
e ***
sono specificate dalla lingua standard e sono molto utili per testare le cose. Sono una caratteristica del REPL e quindi non sono e non dovrebbero essere utili in un "codice del mondo reale".