assq-delete-all
est proche de ce que vous voulez. Il recherche les éléments par identité d'objet (eq
), et non par égalité de valeur (equal
). Il supprime tous les éléments correspondants, pas seulement le premier. Il renvoie la liste modifiée. Vous pouvez adapter le code de cette fonction pour faire ce que vous voulez. (Mais si vous allez appeler assoc-pop
dans une boucle, et toutes vos clés sont des symboles, assq-delete-all
fait tout dont vous avez besoin.)
Notez que "a"
et 'a
sont des objets complètement différents: le premier est une chaîne, le second est un symbole. Donc, votre deuxième ligne aurait dû être (assoc-pop 'a alist)
.
Mais en fait, l'appel (assoc-pop 'a alist)
ne peut pas fonctionner (sauf si assoc-pop
est une macro), car il est incapable de supprimer le premier élément d'une liste. Vous pouvez créer une fonction qui prend un symbole comme argument et modifie la liste correspondant à la valeur du symbole, en suivant le modèle de add-to-list
. Vous l'appelez (assoc-pop 'a 'alist)
.
Merci aussi pour le point sur les symboles, je suis nouveau à lisp et je n'ai pas encore saisi le symbole/liste/autres choses. Je corrige l'erreur! – pygabriel