J'ai trouvé que différents packages dans leurs instructions d'installation utilisent soit push, soit add-to-list (par exemple en ajoutant un répertoire à load-path) et je me demandais quelle était la différence et quel serait le cas d'utilisation de chacun.
28
add-to-list
de code à l'aidecl-pushnew
, et j'ai trouvé cet article de blog assez instructif: yoo2080.wordpress.com/2013/09/11/…Réponses:
Ce que #zck mentionne est une différence. Mais si c'était la seule différence, vous pourriez poser des questions sur
cl-pushnew
etadd-to-list
.Une autre différence importante:
add-to-list
est une fonction, ce qui signifie qu'elle évalue tous ses arguments, en particulier le premier.push
est une macro (tellecl-pushnew
quelle) - elle n'évalue pas son deuxième argument; au lieu de cela, il l'interprète comme un lieu généralisé.Par exemple, si le deuxième argument est un symbole, il est considéré comme une variable, et la valeur du premier argument est consignée sur la valeur de ce symbole en tant que variable, et la variable est définie sur ce nouveau contre.
Comme le dit la chaîne de doc de
add-to-list
:la source
add-to-list can't use lexical var ...; use push or cl-pushnew
(push (5 6) my-list)
me donne toujours une erreur -5
n'est pas une fonction. En quoi est-ce différentadd-to-list
du comportement de?(5 6)
à l'endroit (valeur de la variable),my-list
vous devez créer la liste(5 6)
. Une façon de le faire est d'utiliser'(5 6)
; une autre est d'utiliser(list 5 6)
.push
évalue l'argument.push
est un endroit, comme une variable. Le premier argument est évalué, pris en compte sur la valeur de cette variable, et la variable est définie sur ce nouveau contre.add-to-list
évalue son premier argument pour produire la variable dont la valeur est mise à jour.push
n'évalue pas son deuxième argument, qui est la variable à mettre à jour. L'ordre d'argument est inversé entre les deux.De la documentation Emacs , ou
C-h f push
:De la même page, ou
C-h f add-to-list
:Donc,
add-to-list
ne pousse que si l'élément n'est pas déjà là.la source
cl-pushnew
se comporte commeadd-to-list
.Une autre différence:
push
ajoute un élément au début de la liste .add-to-list
vous permet d'ajouter un élément au début ou à la fin de la liste .la source