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 ersten foo Funktion ändern?

  • Ich dachte immer, (list 'a 'b 'c) und '(a b c) sind gleich? Was ist der Unterschied?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top