Ich habe festgestellt, dass verschiedene Pakete in ihren Installationsanweisungen entweder push oder add-to-list verwenden (z. B. ein Verzeichnis zum Ladepfad hinzufügen), und ich habe mich gefragt, was der Unterschied ist und was der Anwendungsfall für jedes ist.
26
add-to-list
in Code mit umzuwandelncl-pushnew
, und fand diesen Blog-Beitrag ziemlich aufschlussreich: yoo2080.wordpress.com/2013/09/11/…Antworten:
Was #zck erwähnt, ist ein Unterschied. Aber wenn das der einzige Unterschied wäre, könnte man nach
cl-pushnew
und fragenadd-to-list
.Ein weiterer wichtiger Unterschied:
add-to-list
ist eine Funktion, dh sie wertet alle Argumente aus, insbesondere das erste.push
ist ein Makro (wie es istcl-pushnew
) - es wertet sein zweites Argument nicht aus; Stattdessen wird es als verallgemeinerter Ort interpretiert.Wenn das zweite Argument beispielsweise ein Symbol ist, wird es als Variable betrachtet, und der Wert des ersten Arguments wird auf den Wert dieses Symbols als Variable angewendet, und die Variable wird auf diese neuen Nachteile gesetzt.
Wie die Doc-Zeichenfolge von
add-to-list
sagt:quelle
add-to-list can't use lexical var ...; use push or cl-pushnew
(push (5 6) my-list)
gibt mir trotzdem einen fehler -5
ist keine funktion. Wie ist das anders alsadd-to-list
das Verhalten von?(5 6)
an die Stelle (Wert der Variablen) verschieben möchten, müssen Sie die Listemy-list
erstellen(5 6)
. Eine Möglichkeit, dies zu tun, ist die Verwendung von'(5 6)
; eine andere ist zu benutzen(list 5 6)
.push
wertet das Argument aus.push
ist ein Ort, z. B. eine Variable. Das erste Argument wird ausgewertet, auf den Wert dieser Variablen bezogen, und die Variable wird auf diese neuen Nachteile gesetzt.add-to-list
wertet sein erstes Argument aus, um die Variable zu erzeugen, deren Wert aktualisiert wird.push
wertet das zweite Argument nicht aus, bei dem es sich um die zu aktualisierende Variable handelt. Die Arg-Reihenfolge ist zwischen den beiden umgekehrt.Noch ein Unterschied:
push
Fügt ein Element am Anfang der Liste hinzu .add-to-list
Ermöglicht das Hinzufügen eines Elements am Anfang oder Ende der Liste .quelle
Aus der Emacs-Dokumentation oder
C-h f push
:Von derselben Seite oder
C-h f add-to-list
:Drückt also
add-to-list
nur, wenn das Element noch nicht da ist.quelle
cl-pushnew
benimmt sich wieadd-to-list
.