2009-09-13 32 views
7

Ich lese "auf Lisp" und stieß auf diesen Code (ich habe es ein wenig vereinfacht).Was ist der Unterschied zwischen '(a b c) und (Liste' a 'b' c)?

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 bedeutet das *? Ist es der vorherige Funktionsaufruf? Ist es geeignet, in realem Code zu verwenden?

  • Warum ändert (nconc * '(D E)) den Rückgabewert der ersten foo-Funktion?

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

Antwort

14

Der Aufruf von LIST erstellt bei jeder Auswertung eine neue Liste. Das Listenliteral kann nach der Kompilierung in einem schreibgeschützten Speichersegment platziert werden. Eine destruktive Aktualisierung der Listen mit NCONC ist dann problematisch, möglicherweise mit undefinierten Konsequenzen (Segmentierungsfehler, Änderung des Literals für zukünftige Referenzen oder gar nichts).

+0

hatte nicht daran gedacht;) –

8

Variablen *, ** und *** sind in der Sprache standard angegeben und sie sind sehr nützlich beim Testen von Dingen. Sie sind ein Merkmal der REPL und sollten nicht in einem "echten Code" nützlich sein.

+0

+1 für HyperSpec Referenz – sigjuice

Verwandte Themen