BiL_DelOne

Fonction Catégorie Version
BIL 10 BiL_DelOne Gestion des Listes 1.0 - Janvier 2007

Description

But Retourne une liste après y avoir enlevé un élément unique.
Prototype (BiL_DelOne Item1 Liste1)
Argument Elément - L’élément à supprimer de la liste - tout type -
Liste - La liste à réduire - Liste -
Retours La liste réduite ou nil
Var. globales Néant
Description Retire un élément unique d'une liste.
Notes Cette routine ne fonctionne pas si l'élément à effacer n'est pas unique :
elle retournera alors une liste aberrante.
Par contre, elle est nettement plus rapide que BiL_DelItem.
Si l'élément n'est pas trouvé, la liste est retournée intacte.
Voir également les fonctions BiL_DelItem et BiL_DelPrim.
Exemples

Command: (setq list1 '(1 2 3 4 5 6 7 8 9))
	(1 2 3 4 5 6 7 8 9)
(BiL_DelOne 3 list1)    retourne   (1 2 4 5 6 7 8 9)
	
(BiL_DelOne 10 list1)   retourne   (1 2 3 4 5 6 7 8 9)

(BiL_DelOne 6 list1)    retourne   (1 2 3 4 5 7 8 9)

(BiL_DelOne 3 toto)     retourne   nil	

Command : (setq list2 '("A" "B" "C" "D" "E" "D"))
	("A" "B" "C" "D" "E" "D")
(BiL_DelOne "E" list2) retourne	("A" "B" "C" "D" "D")

(BiL_DelOne "D" list2) retourne	("A" "B" "C" "D" "E" "E" "D")	 
mais 
(BiL_DelItem "D" list2) retourne	("A" "B" "C" "E")

La fonction


 1- (Defun BiL_DelOne (*Item1 *List1)

 2-    (if (and 
 3-	             (Listp *List1)       ;  Si *List1 est bien une liste
 4-              (member *Item1 *List1)   ;  et *Item1 un élément de cette liste,
 5-        )
 6-        (setq *List1 (append
 7-	                    	  (reverse (cdr (member *Item1 (reverse *List1))))
 8-	 	              	  (cdr (member *Item1 *List1))
 9-                      )
10-        )
11-    )                                 ;  fin de if
12-    *List1                            ;  retourne *List1 (une liste ou nil)
13- )


Explication des lignes 6, 7 et 8 :


 
 Supposons       Command: (setq *list1 '(A B C D E F G)
		                        *Item1 'C )

Ligne 7  (reverse *List1)                  retourne	(G F E D C B A)
		reverse : Inverse l'ordre des éléments de *List1.
		
Ligne 7  (member *Item1 (reverse *List1))  retourne	(C B A)
		member : Retourne le reste de *List1 en commençant par la première 
                             occurrence de *Item1.
		
Ligne 7  (cdr(member *Item1 (reverse *List1)))	retourne	(B A)
		cdr :  retourne ce qui suit après y avoir enlevé le 1er élément.
		
Ligne 7  (reverse (cdr (member *Item1 (reverse *List1))))   retourne  (A B)
		reverse :	Inverse l'ordre des éléments de la liste obtenue.

Ligne 8  (member *Item1 *List1)	           retourne 	(C D E F G)
		member :  Retourne le reste de *List1 en commençant par la première 
		occurrence de *Item1.
		Dans cette ligne, *List1 n'a pas été inversé.
				
Ligne 8  (cdr(member *Item1 *List1))       retourne 	(D E F G)
		cdr :  retourne la liste qui suit après y avoir enlevé le 1er élément.

Ligne 6    (append  ligne 7  ligne 8 )     retourne	(A B D E F G)


append : ajoute les éléments du résultat de la ligne 8 dans la liste obtenue ligne 7
listp : retourne T si *List1 est une liste, nil dans les autres cas.
member : Ligne 4 - retourne nil si l'argument *Item1 ne fait pas partie de la liste *List1
member : Ligne 7 - si *Item1 fait partie de *List1, retourne le reste de la liste en commençant par la première occurrence de *Item1.
reverse : inverse l'ordre des éléments de *List1.
cdr : retourne une liste après y avoir enlevé le 1er élément.
append : réunit plusieurs listes en une liste unique