Il n'y a pas qu'une seule solution possible, mais je resterai proche de votre code. Puisqu'il s'agit de devoirs, je ne vais pas vous donner une réponse utile, mais je vais essayer de vous donner des choses à réfléchir, et donner des pointeurs détaillés:
Essayez de comprendre ce que fait votre code et ce que vous voulez vraiment faire:
(defun remove-all (a l)
(cond ((null l) nil)
((eql (car l) a) (delete a (cdr l)))
(t (cons (car l) (delete a (cdr l))))))
(Renommé à remove-all
parce delete
est déjà pris, et réindenté d'une manière saine d'esprit.)
pour les listes plates, le code semble fonctionner; mais qu'en est-il des listes imbriquées? Regardons un exemple simple:
- Que se passera-t-il si vous évaluez
(remove-all 1 '((1)))
?
- Que voulez-vous pour cette entrée?
- Comment pouvez-vous y parvenir?
Jetons un coup d'oeil:
Qu'arrive-t-:
- La liste n'est pas
null
, allez
- Le
car
n'est pas eq
-1
aller sur
'(1)
obtient cons
ed à (remove-all '())
, ce qui donne '((1))
Ainsi, il n'a pas reconnu que le car
lui-même est une liste qui devrait être recherchée éléments correspondant. Le problème semble se situer entre la première et la deuxième étape.
Que faut-il faire:
- Vérifiez, si le
car
lui-même est une liste
- Si oui, appelez
remove-all
sur elle
- Ensuite,
cons
le résultat à la cdr
, qui a également besoin pour être "nettoyé" (Indice: Mais seulement si il y a quelque chose à)
Comment exactement?
- Ajouter une clause
cond
qui fait les choses mentionnées sous 2 - gauche comme devoirs
Ne pas le nom de votre fonction SUPPR. Ce nom est déjà pris par Common Lisp pour une fonction intégrée. –
Le test d'égalité par défaut doit également être EQL et non EQ. –