Qual è la differenza tra push e add-to-list?


28

Ho scoperto che pacchetti diversi nelle loro istruzioni di installazione usano push o aggiungi alla lista (ad esempio aggiungendo una directory al percorso di caricamento) e mi chiedevo quale fosse la differenza e quale sarebbe il caso d'uso per ognuno.


1
Stavo lottando per convertire il codice usando il add-to-listcodice usando cl-pushnew, e ho trovato questo post sul blog abbastanza illuminante: yoo2080.wordpress.com/2013/09/11/…
dangom

Risposte:


22

Ciò che #zck menziona è una differenza. Ma se questa fosse l'unica differenza, allora potresti chiedere cl-pushnewe add-to-list.

Un'altra differenza importante: add-to-listè una funzione, il che significa che valuta tutti i suoi argomenti, in particolare il primo. pushè una macro (così com'è cl-pushnew) - non valuta il suo secondo argomento; invece, lo interpreta come un luogo generalizzato.

Ad esempio, se il secondo argomento è un simbolo, viene considerato come una variabile e il valore del primo argomento viene consegnato al valore di quel simbolo come una variabile e la variabile viene impostata su quel nuovo contro.

Come add-to-listdice la stringa di documenti di :

This is handy to add some elements to configuration variables,
but please do not abuse it in Elisp code, where you are usually
better off using `push' or `cl-pushnew'.

6
Sempre secondo il compilatore di byte:add-to-list can't use lexical var ...; use push or cl-pushnew
Malabarba,

(push (5 6) my-list)mi dà ancora un errore - 5non è una funzione. In che modo si differenzia dal add-to-listcomportamento?
markasoftware

@markasoftware: cosa stai cercando di fare? Se si desidera spostare l'elenco (5 6)nella posizione (valore della variabile), my-listè necessario creare l'elenco (5 6). Un modo per farlo è usare '(5 6); un altro è da usare (list 5 6). pushvaluta l'argomento.
Drew

@Drew hai detto ora che valuta l'argomento, ma la tua risposta afferma letteralmente "non valuta il suo primo argomento", che è la fonte della mia confusione.
markasoftware

@markasoftware: mi dispiace; Avevo un refuso - ho scritto "primo argomento" dove avrei dovuto scrivere "secondo argomento". Ora corretto - grazie. Il secondo argomento pushè un posto, come una variabile. Il primo argomento viene valutato, consegnato sul valore di quella variabile e la variabile viene impostata su quei nuovi contro. add-to-listvaluta il suo primo argomento per produrre la variabile il cui valore viene aggiornato. pushnon valuta il suo secondo argomento, che è la variabile da aggiornare. L'ordine arg è invertito tra i due.
Ha disegnato

15

Dalla documentazione di Emacs o C-h f push:

Macro: nome elemento elenco push

Questa macro crea un nuovo elenco la cui macchina è elemento e il cui cdr è l'elenco specificato dal nome elenco e salva tale elenco nel nome elenco.

Dalla stessa pagina, oppure C-h f add-to-list:

Funzione: elemento simbolo da aggiungere all'elenco e append comparativo-fn opzionale

Questa funzione imposta il simbolo della variabile consing l'elemento sul vecchio valore, se l'elemento non è già membro di quel valore.

Quindi add-to-listspinge solo se l'elemento non è già lì.


cl-pushnewsi comporta come add-to-list.
Sam Boosalis,

15

Un'altra differenza:

pushaggiunge elemento all'inizio dell'elenco .

add-to-listconsente di aggiungere elementi all'inizio o alla fine dell'elenco .

(setq testasdf nil)

(push 'a testasdf)

testasdf
(a)

(add-to-list 'testasdf 'b)

testasdf
(b a)

;; add element to the end
(add-to-list 'testasdf "hello" t)

testasdf
(b a "hello")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.