Descubrí que los diferentes paquetes en sus instrucciones de instalación usan push o add-to-list (por ejemplo, agregar un directorio a load-path) y me preguntaba cuál es la diferencia y cuál sería el caso de uso para cada uno.
Descubrí que los diferentes paquetes en sus instrucciones de instalación usan push o add-to-list (por ejemplo, agregar un directorio a load-path) y me preguntaba cuál es la diferencia y cuál sería el caso de uso para cada uno.
Respuestas:
Lo que #zck menciona es una diferencia. Pero si esa fuera la única diferencia, entonces podría preguntar sobre cl-pushnew
y add-to-list
.
Otra diferencia importante: add-to-list
es una función, lo que significa que evalúa todos sus argumentos, en particular, el primero. push
es una macro (como está cl-pushnew
): no evalúa su segundo argumento; en cambio, lo interpreta como un lugar generalizado.
Por ejemplo, si el segundo argumento es un símbolo, entonces se considera como una variable, y el valor del primer argumento se incluye en el valor de ese símbolo como una variable, y la variable se establece en esa nueva desventaja.
A medida que la cadena de documentación de add-to-list
dice:
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'.
add-to-list can't use lexical var ...; use push or cl-pushnew
(push (5 6) my-list)
Todavía me da un error, 5
no es una función. ¿Cómo es esto diferente al add-to-list
comportamiento de?
(5 6)
al lugar (valor de la variable) my-list
, debe crear la lista (5 6)
. Una forma de hacerlo es usar '(5 6)
; otro es para usar (list 5 6)
. push
evalúa el argumento.
push
es un lugar, como una variable. Se evalúa el primer argumento, consed en el valor de esa variable, y la variable se establece en esos nuevos inconvenientes. add-to-list
evalúa su primer argumento para producir la variable cuyo valor se actualiza. push
no evalúa su segundo argumento, que es la variable a actualizar. El orden arg se invierte entre los dos.
De la documentación de Emacs , o C-h f push
:
Macro: elemento de lista nombre de inserción
Esta macro crea una nueva lista cuyo auto es elemento y cuyo cdr es la lista especificada por listname, y guarda esa lista en listname.
Desde la misma página, o C-h f add-to-list
:
Función: elemento de símbolo de agregar a la lista y opcional agregar compare-fn
Esta función establece el símbolo de la variable al convertir el elemento en el valor anterior, si el elemento aún no es miembro de ese valor.
Entonces add-to-list
solo empuja si el elemento ya no está allí.
cl-pushnew
se comporta como add-to-list
.
Otra diferencia:
push
agrega elemento al comienzo de la lista .
add-to-list
le permite agregar elementos al principio o al final de la lista .
(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")
add-to-list
a código usandocl-pushnew
, y encontré que esta publicación del blog es bastante esclarecedora: yoo2080.wordpress.com/2013/09/11/…