Questo passo On Lisp
è veramente confusa - non è chiaro come la restituzione di un elenco citato come '(oh my)
può effettivamente alterare come la funzione si comporta in futuro: non sarà la lista restituita essere generato di nuovo nella funzione da zero, la prossima volta che viene chiamato?Bizzarro lista esempio citato da On Lisp
Se definiamo esclamare in modo che il suo valore di ritorno incorpora un elenco citato,
(defun exclaim (expression) (append expression ’(oh my)))
Poi alcuna modifica distruttiva successiva del valore di ritorno
(exclaim ’(lions and tigers and bears)) -> (LIONS AND TIGERS AND BEARS OH MY) (nconc * ’(goodness)) -> (LIONS AND TIGERS AND BEARS OH MY GOODNESS)
potrebbe modificare l'elenco all'interno della funzione:
(exclaim ’(fixnums and bignums and floats)) -> (FIXNUMS AND BIGNUMS AND FLOATS OH MY GOODNESS)
Per rendere la prova esclamare contro tali problemi, dovrebbe essere scritto:
(defun exclaim (expression) (append expression (list ’oh ’my)))
Come esattamente è che l'ultima chiamata al exclaim
aggiungendo la parola goodness
al risultato? La funzione non fa riferimento a nessuna variabile esterna, quindi in che modo la chiamata separata a nconc
ha effettivamente modificato il funzionamento della funzione exclaim
?
Vedo che hai una risposta, ma dai un'occhiata a [questa risposta] (http://stackoverflow.com/a/18790523/1281433) per ulteriori discussioni e risorse –
Inoltre, questo è probabilmente un duplicato di [Scenario Strange Lisp Quoting - Graham's On Lisp, pagina 37] (http://stackoverflow.com/q/4003115/1281433). –