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 funzione foo ?

  • Ho sempre pensato che (lista 'a' b 'c) e ' (a b c) sono uguali? Qual è la differenza?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top