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.
28
add-to-list
o código usandocl-pushnew
, e eu achei este post para ser bastante enlightling: yoo2080.wordpress.com/2013/09/11/...Respostas:
O que #zck menciona é uma diferença. Mas se essa fosse a única diferença, você poderia perguntar sobre
cl-pushnew
eadd-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
:fonte
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 doadd-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
:Na mesma página, ou
C-h f add-to-list
:Então,
add-to-list
apenas empurra se o elemento ainda não estiver lá.fonte
cl-pushnew
se comporta comoadd-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 .fonte