Eu descobri que pacotes diferentes em suas instruções de instalação usam push ou add-to-list (por exemplo, adicionando um diretório ao caminho de carregamento) e fiquei imaginando qual seria a diferença e qual seria o caso de uso de cada um.
Eu descobri que pacotes diferentes em suas instruções de instalação usam push ou add-to-list (por exemplo, adicionando um diretório ao caminho de carregamento) e fiquei imaginando qual seria a diferença e qual seria o caso de uso de cada um.
Respostas:
O que #zck menciona é uma diferença. Mas se essa fosse a única diferença, você poderia perguntar sobre cl-pushnew
e add-to-list
.
Outra diferença importante: add-to-list
é uma função, o que significa que avalia todos os seus argumentos, em particular o primeiro. push
é uma macro (como está cl-pushnew
) - não avalia seu segundo argumento; em vez disso, interpreta-o como um local generalizado.
Por exemplo, se o segundo argumento for um símbolo, ele será considerado uma variável, e o valor do primeiro argumento será incluído no valor desse símbolo como variável, e a variável será configurada para os novos contras.
Como diz a sequência de documentos add-to-list
:
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)
ainda me dá um erro - 5
não é uma função. Como isso é diferente do add-to-list
comportamento?
(5 6)
para o local (valor da variável) my-list
, é necessário criar a lista (5 6)
. Uma maneira de fazer isso é usar '(5 6)
; outro é usar (list 5 6)
. push
avalia o argumento.
push
é um lugar, como uma variável. O primeiro argumento é avaliado, com base no valor dessa variável e a variável é definida com os novos contras. add-to-list
avalia seu primeiro argumento para produzir a variável cujo valor é atualizado. push
não avalia seu segundo argumento, que é a variável a ser atualizada. A ordem do argumento é invertida entre os dois.
Na documentação do Emacs , ou C-h f push
:
Macro: elemento da lista pushname
Essa macro cria uma nova lista cujo carro é elemento e cujo cdr é a lista especificada pelo nome da lista e salva essa lista no nome da lista.
Na mesma página, ou C-h f add-to-list
:
Função: elemento de símbolo adicionar à lista e anexar opcional compare-fn
Esta função define o símbolo da variável ao incluir o elemento no valor antigo, se o elemento ainda não for um membro desse valor.
Então, add-to-list
apenas empurra se o elemento ainda não estiver lá.
cl-pushnew
se comporta como add-to-list
.
Outra diferença:
push
adiciona elemento ao início da lista .
add-to-list
permite adicionar elemento ao início ou ao final da 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
o código usandocl-pushnew
, e eu achei este post para ser bastante enlightling: yoo2080.wordpress.com/2013/09/11/...