Qual é a diferença entre push e add-to-list?


28

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.


11
Eu estava lutando para código convertido utilizando add-to-listo código usando cl-pushnew, e eu achei este post para ser bastante enlightling: yoo2080.wordpress.com/2013/09/11/...
dangom

Respostas:


22

O que #zck menciona é uma diferença. Mas se essa fosse a única diferença, você poderia perguntar sobre cl-pushnewe 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'.

6
Também de acordo com o compilador de bytes:add-to-list can't use lexical var ...; use push or cl-pushnew
Malabarba 15/01

(push (5 6) my-list)ainda me dá um erro - 5não é uma função. Como isso é diferente do add-to-listcomportamento?
markasoftware

@markasoftware: O que você está tentando fazer? Se você deseja enviar a lista (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). pushavalia o argumento.
Drew

@ Drew você diz agora que avalia o argumento, mas sua resposta literalmente afirma "ele não avalia seu primeiro argumento", que é a fonte da minha confusão.
markasoftware

@ markasoftware: desculpe; Eu cometi um erro de digitação - escrevi "primeiro argumento" onde deveria ter escrito "segundo argumento". Corrigido agora - obrigado. O segundo argumento para 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-listavalia seu primeiro argumento para produzir a variável cujo valor é atualizado. pushnão avalia seu segundo argumento, que é a variável a ser atualizada. A ordem do argumento é invertida entre os dois.
Drew

15

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-listapenas empurra se o elemento ainda não estiver lá.


cl-pushnewse comporta como add-to-list.
sam boosalis 5/03

15

Outra diferença:

pushadiciona elemento ao início da lista .

add-to-listpermite 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")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.