BiL_DelIf (DeL if)

Fonction Catégorie Version
BIL 21 BiL_DelIf Gestion des Listes 1.0 - Janvier 2007

Description

But Retire, sous condition, un ou plusieurs éléments d’une liste.
Prototype (BiL_DelIf Condition Liste)
Argument Condition - La fonction de condition - fonction -
Liste - La liste à traiter - Liste -
Retours La liste modifiée ou non
Var. globales Néant
Description Retourne une liste après y avoir enlevé les éléments qui satisfont à une condition
Notes La fonction de condition ne doit comporter qu’un seul argument.
La fonction de condition doit être sous quote comme ’zerop
Exemples

Command: (BiL_DelIf 'zerop '(0 1 2 3 4 5 6 0 7 8))
	retourne	(1 2 3 4 5 6 7 8)
  (zerop vérifie si un élément est égal à 0)

Command: (BiL_DelIf 'numberp '(0 1 2 (1 2) 3 (4 5))) 
	retourne	((1 2) (4 5))
  (numberp vérifie si un élément est un nombre réel ou entier)
	
Et si on crée une nouvelle fonction personnalisée telle que :
Command: (defun stringp (*str)(= (type *str) 'STR))
	On pourra supprimer les chaînes d’une liste :
Command: (BiL_DelIf 'stringp '(1 2 (3 4) "toto" 5 ""))
	qui retourne   (1 2 (3 4) 5)

La fonction


 1-    (defun BiL_DelIf (*fct *List1)

 2-           (cond
 3-              ((atom *List1) 
 4-                 *List1
 5-              )      
 6-              ((apply *fct (list (car *List1))) 
 7-                 (BiL_DelIf *fct (cdr *List1))
 8-              )
 9-              (t (cons 
10-                      (car *List1) 
11-                      (BiL_DelIf *fct (cdr *List1))
12-                 )
13-              )
14-           )
15-    )
Ligne 2 :    Conditions :
Lignes 3-4 :  - Si l’argument *List1 est un atome, retourne *List1
Lignes 6-7 :  - Si la fonction de condition appliquée au premier élément restant de
               *List1 retourne T, continue  la fonction récursivement sur le reste de 
               *List1 (Dans ce cas, le 1er élément n’est pas rajouté à la liste de retour).
Lignes 9-12 :	- Dans tous les autres cas, construit une liste avec le 1er élément de 
                  *List1 et le résultat de la récursion du reste de la liste.

Si on ajoute (print *List1) entre les lignes 1 et 2 à l’exemple suivant :
Command: (BiL_DelIf 'zerop '(0 1 2 3 4 5 6 0 7 8))
On va obtenir les valeurs suivantes de *List1, au fur et à mesure de la récursion.
	(0 1 2 3 4 5 6 0 7 8)
	(1 2 3 4 5 6 0 7 8)
	(2 3 4 5 6 0 7 8)
	(3 4 5 6 0 7 8)
	(4 5 6 0 7 8)
	(5 6 0 7 8)
	(6 0 7 8)
	(0 7 8)
	(7 8)
	(8)
	nil (1 2 3 4 5 6 7 8)

Atom : Vérifie si un élément est un atome.
Apply : Transmet une liste d'arguments à la fonction spécifiée.
Car : Renvoie le premier élément d'une liste.
Cdr : Renvoie une liste contenant tous les éléments de cette liste sauf le premier.
Cons : Construit une liste en y ajoutant le nouvel élément en début de liste.