Diese Passage aus On Lisp
ist wirklich verwirrend - es ist nicht klar, wie eine zitierte Liste Rückkehr wie '(oh my)
kann tatsächlich ändern, wie die Funktion in der Zukunft verhält: wird nicht die zurückgegebenen Liste Wird in der Funktion von Grund auf neu generiert, beim nächsten Aufruf?Bizarre zitierte Liste Beispiel von On Lisp
Wenn wir definieren ausrufen, so dass der Rückgabewert notierten Liste enthält,
(defun exclaim (expression) (append expression ’(oh my)))
Dann kann jede später destruktiv Änderung des Rückgabewertes
(exclaim ’(lions and tigers and bears)) -> (LIONS AND TIGERS AND BEARS OH MY) (nconc * ’(goodness)) -> (LIONS AND TIGERS AND BEARS OH MY GOODNESS)
könnte die Liste verändern innerhalb der Funktion:
(exclaim ’(fixnums and bignums and floats)) -> (FIXNUMS AND BIGNUMS AND FLOATS OH MY GOODNESS)
ausrufen Beweis gegen solche Probleme zu machen, soll es geschrieben werden:
(defun exclaim (expression) (append expression (list ’oh ’my)))
Wie genau ist der letzte Aufruf an exclaim
goodness
zu dem Ergebnis, das Wort hinzufügen? Die Funktion referenziert keine externe Variable. Wie also hat der separate Aufruf an nconc
die Funktion der exclaim
Funktion verändert?
Ich sehe, Sie haben eine Antwort, aber werfen Sie einen Blick auf [diese Antwort] (http://Stackoverflow.com/a/18790523/1281433) für einige zusätzliche Diskussion und Ressourcen –
Auch dies ist wahrscheinlich ein Duplikat von [Strange Lisp Quoting-Szenario - Graham's On Lisp, Seite 37] (http://stackoverflow.com/q/4003115/1281433). –