Was ist der Unterschied zwischen '(a b c) und (Liste' a 'b' c)?
-
07-07-2019 - |
Frage
Ich lese "On Lisp" und begegnet diesen Code (ich es vereinfacht ein wenig).
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)
-
Was genau ist
*
bedeuten? Ist es der vorherige Funktionsaufruf? Ist es geeignet in der realen Welt Code zu benutzen? -
Warum
(nconc * '(D E))
den Rückgabewert der erstenfoo
Funktion ändern? -
Ich dachte immer,
(list 'a 'b 'c)
und'(a b c)
sind gleich? Was ist der Unterschied?
Lösung
Der Aufruf von LIST erstellt eine neue Liste jedes Mal ausgewertet. Die Liste wörtliche könnte in einem Read-Only-Memory-Segment nach der Kompilierung platziert werden. Ein vernichtendes Update auf den Listen mit NCONC ist dann problematisch, möglicherweise mit nicht definierten Folgen (Segmentierung Fehlern, für zukünftige Referenzen wörtlichen ändern oder gar nichts).
Andere Tipps
Variablen *
, **
und ***
werden durch die Sprache Standard , und sie sind sehr nützlich, wenn die Dinge zu testen. Sie sind ein Merkmal der REPL und sind so nicht, und nicht sollte, nützlich sein, in einem „realen Welt Code“.