0
votes

LISP - Gardez des mots finir par lettre donnée

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) xxx


0 commentaires

4 Réponses :


0
votes

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: xxx


0 commentaires

0
votes

Quelques points de style: n'utilisez pas (pas la liste) ; Utilisez plutôt (null liste) ou (endp liste) qui souligne que liste est une liste vide ou que le traitement a atteint la fin. de liste , respectivement. En outre, utilisez '() lorsque l'intention est de représenter une liste vide; Utilisez nil lorsque l'intention est de représenter Boolean False.

Les éléments de Liste sont des symboles et x est un symbole; Ces symboles doivent être convertis en séquences afin que le caractère final du symbole puisse être évalué. chaîne fera le travail. Mais le code OP a deux problèmes ici: Longueur prend un argument de séquence, de sorte que la valeur de (lise de voiture) doit également être convertie à l'aide de la chaîne ; 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. xxx

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.

dans le code affiché, (chargeur (ligne de voiture) ) 0) est le premier candidat probable. Essayez (voiture de voiture) sur la replique et voyez si cela évalue à 'avoir comme prévu. Quand c'est le cas, essayez (longueur (lise de voiture)) . Cela vous enverra à nouveau au débogueur avec une erreur de type et un message comme

Longueur: ne sont pas une séquence .

Ceci suggère que vous devez utiliser (chaîne (voiture de la voiture)) de la même manière que (chaîne x) est utilisé dans la ligne suivante de la définition de la fonction d'origine. Ainsi, essayez (longueur (chaîne (lectuoche de voiture))) 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 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)))) . Cela nous atterrit à nouveau dans le débogueur avec un message comme:

Char: Index 4 doit être inférieur à la longueur de la chaîne .

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: (char ( String (Liste de voitures)) (- (longueur (chaîne (lectuoche de voiture))) 1)) . Maintenant, nous avons du succès, avec la replication du renvoi de la # \ e . 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.


0 commentaires

2
votes

Notez que la tâche que vous avez donnée enseigne un style de programmation LISP qui se trouve dans le monde réel non utilisé.

  • Nous devons fonctionner de chaînes, qui sont des vecteurs de caractères
  • Nous pouvons utiliser la fonction standard supprimer
  • La modification destructivement d'une liste est parfois utile mais peut être évitée. Voir Supprimer pour une version destructive de Supprimer

    Exemple: xxx


0 commentaires

0
votes
(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))

0 commentaires