Il y a quelques choses que vous pouvez faire pour améliorer cette fonction.
Tout d'abord, nous allons indentent correctement
(defun equal1 (V L)
(cond
((= (length L) 0))
(T (cond
((not (= V (car (equal1 V (cdr L))))) (cdr L))))))
Plutôt que de dire (= (length l) 0)
, vous pouvez utiliser (zerop (length l))
. Un point sylistique mineur. Pire, cette branche ne renvoie aucune valeur. Si la liste L
est vide, que devrions-nous retourner?
Le problème avec la fonction se trouve dans la branche T
du premier cond
.
Ce que nous voulons faire est
- supprimer tout élément de la liste qui est la même valeur que
V
- garder tout élément qui ne
=
à V
La fonction doit renvoyer une liste.
L'expression
(cond
((not (= V (car (equal1 V (cdr L))))) (cdr L)))
tente (je pense) pour traiter les conditions 1 et 2. Toutefois, il est clairement ne fonctionne pas.
Nous devons rappeler que les éléments sont dans une liste et que le résultat de la fonction égale doit être une liste. Dans l'expression ci-dessus, le résultat de la fonction sera un booléen et donc le résultat de l'appel de la fonction sera booléen.
La fonction doit parcourir chaque élément de la liste et lorsqu'elle voit une valeur correspondante, ignorez-la, sinon utilisez la fonction contre pour générer la liste de sortie filtrée.
Voici un squelette pour vous aider. Notez que nous n'avons pas besoin du cond
intégré et que nous avons juste 3 conditions à traiter - liste vide, filtre une valeur, ou continue à construire la liste.
(defun equal-2 (v l)
(cond
((zerop (length L)) nil)
((= v (car l)) <something goes here>) ;skip or filter the value
(t (cons (car l) <something goes here>)))) ;build the output list
Bien sûr, étant Common Lisp, il existe une fonction intégrée qui fait cela. Vous pouvez regarder dans remove-if
...
Quelle variété de Lisp est-ce? – user2357112
Je ne suis pas sûr mais d'après ce que j'ai vu, c'est comme le générique auquel nous n'utilisons que cond. –
Son tout ce que je reçois de Lisp fonctionne édition personnelle –