J'essaie de modifier cette fonction de manière à ce que la liste ne conserve que les mots se terminant par une lettre donnée. J'ai peu de restriction sur ce que je suis autorisé à utiliser et à garder le char, le rallacd et la longueur pour le faire. J'ai maintenant des difficultés avec la partie "longueur". J'arrive initialement à le faire de manière à garder tous les mots à partir de la lettre donnée, mais j'ai du mal à faire le contraire à la ligne 5.
(SETQ LISTE '(avoir lu le silence d'art nasé)) / code>
J'aurais le résultat suivant
(Endingwith 'E Liste) => (avoir le silence du nez) code> p>
4 Réponses :
Compte tenu des ressources limitées que vous recevez, cela appelle une solution récursive. La valeur de (Endingwith 'e Liste) doit être définie en termes de valeur de l'appel de la fin avec le reste de la liste et de l'ajout ou non du premier élément s'il correspond à "
Notez plus avant que dans votre cas, la longueur doit être utilisée avec une chaîne, utilisez donc (longueur (chaîne (lise de voiture))) au lieu de (chaîne (ligne de la voiture))).
La fonction ressemblerait à ceci:
Quelques points de style: n'utilisez pas Les éléments de Un moyen de déboguer des programmes tels que celui-ci dans la Lisp commune est entrer dans la réplique et expérimenter. Lorsque vous utilisez une fonction et que vous vous envoie au débogueur, recherchez des lignes dans cette fonction pouvant avoir des problèmes. P> dans le code affiché, Ceci suggère que vous devez utiliser Mais ce message nous rappelle que des séquences sont indexées de zéro dans les Lisp communes et que le dernier index d'une chaîne de longueur 4 est 3. Ainsi, une fois, une fois, à nouveau sur la replache: (pas la liste) code>; Utilisez plutôt
(null liste) code> ou
(endp liste) code> qui souligne que
liste code> est une liste vide ou que le traitement a atteint la fin. de
liste code>, respectivement. En outre, utilisez
'() code> lorsque l'intention est de représenter une liste vide; Utilisez
nil code> lorsque l'intention est de représenter Boolean False.
Liste code> sont des symboles et
x code> est un symbole; Ces symboles doivent être convertis en séquences afin que le caractère final du symbole puisse être évalué.
chaîne code> fera le travail. Mais le code OP a deux problèmes ici:
Longueur code> prend un argument de séquence, de sorte que la valeur de
(lise de voiture) code> doit également être convertie à l'aide de la chaîne code>; et des séquences sont indexées de zéro dans les LISP communes, de sorte que le dernier index d'une séquence est inférieur à sa longueur. p>
(chargeur (ligne de voiture) ) 0) code> est le premier candidat probable. Essayez
(voiture de voiture) code> sur la replique et voyez si cela évalue à
'avoir code> comme prévu. Quand c'est le cas, essayez
(longueur (lise de voiture)) code>. Cela vous enverra à nouveau au débogueur avec une erreur de type et un message comme P>
Longueur: ne sont pas une séquence code>. p>
blockQuote>
(chaîne (voiture de la voiture)) code> de la même manière que
(chaîne x) code> est utilisé dans la ligne suivante de la définition de la fonction d'origine. Ainsi, essayez
(longueur (chaîne (lectuoche de voiture))) code> sur la replace. Maintenant, vous devriez voir la valeur attendue de 4, mais il devient évident que la ligne de code d'origine était un peu cognée, car
char code> souhaite que le premier argument soit une chaîne et le deuxième argument à être Un index. Alors essayez à nouveau sur le replon
(char (chaîne (lectuoche de voiture)) (longueur (chaîne (lise de voiture)))) code>. Cela nous atterrit à nouveau dans le débogueur avec un message comme: P>
Char: Index 4 doit être inférieur à la longueur de la chaîne code>. p>
blockQuote>
(char ( String (Liste de voitures)) (- (longueur (chaîne (lectuoche de voiture))) 1)) code>. Maintenant, nous avons du succès, avec la replication du renvoi de la
# \ e code>. Après avoir travaillé sur cette ligne problématique sur la REMP, nous pouvons maintenant remplacer la ligne dans la définition de la fonction d'origine et voir si cela fonctionne. Ça fait. P> p>
Notez que la tâche que vous avez donnée enseigne un style de programmation LISP qui se trouve dans le monde réel em> non utilisé.
supprimer code> li>
- La modification destructivement d'une liste est parfois utile mais peut être évitée. Voir
Supprimer code> pour une version destructive de Supprimer CODE> LI>
ul> Exemple: p> xxx pré> p>
(defun ends-with-p (end s) (string= end (subseq s (- (length s) (length end))))) (defun keep-ending-with (end strings) (remove-if-not #'(lambda (x) (ends-with-p end x)) strings))