IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lisp Discussion :

eliminer les mots dans une liste


Sujet :

Lisp

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Points : 4
    Points
    4
    Par défaut eliminer les mots dans une liste
    Bonjour tout le monde,

    Je dois faire une fonction qui elimine les mots qui commencent avec une lettre donné.

    J'ai pu réussir a faire un code qui elimine les mots mais j'arrive pas à generaliser pour arriver à donner le char caractere qui commence les mots à éliminer.

    Voila le code ; plz help

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun elimine (e liste)
      (cond
        ((not liste) nil)
        ((equal (char (string (car liste))0) #\E) (elimine e (cdr liste)))
        (t (cons (car liste)(elimine e (cdr liste)))) ) )
    ELIMINE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [121]> (elimine 'r '(nez alle elle en regarder nana elmt))             ;;;;ici ce sont les mots commençant par e
    (NEZ ALLE REGARDER NANA)

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Salut !

    L'algorithme est tout simplement incorrect. Regarde, tu veux obtenir elimine(e, liste) (je me sers de la notation habituelle) comme la valeur de elimine(e, cdr(liste)). Mais en principe, la tête de la liste peut faire partie de la réponse, et cette information est perdue. Autrement dit, tu ne peux pas recupérer la tête de la liste en appliquant une fonction quelconque à e et cdr(liste). Alors, avant de coder, je te conseille de concevoir un algorithme. Tu peux le présenter par exemple en forme de pseudocode. Alors on va l'implementer en lisp.

    ***

    TL;DR Si tu as besoin des chaînes de caractères, utilise des chaînes de caractères, pas de symboles.

    Le choix des types de données n'est pas fameux. Notamment, je parle de representation des caractères et chaînes de caractères comme symboles.

    Tout d'abord, il y a des chaînes en lisp.

    Une chaîne, qu'est-ce que c'est ? Conceptuellement, c'est une suite de caractères. C'est-à-dire, une chaîne est un type de données composé. Une chaîne n'est pas « atomique », elle est constituée des caractères.

    En lisp les chaînes sont implementés comme vecteurs (tableaux unidimensionnels) de caractères. C'est tout à fait naturel.

    Au contraire, les symboles ne sont pas un type de données composé. Un symbole est une entité particulière qui n'est pas formée à partir d'autres objets. Ainsi, c'est bizarre d'utiliser des symboles comme données composées.

    Cependent, il y a plusieurs objets associés a un symbole : par exemple, le nom, le paquet, la valeur associée, la fonction associée, etc. Le nom, c'est une chaîne de caractères. Toi, tu utilises les symboles seulement à cause de ses noms. C'est illogique et du mauvais style; ça rend ton programme plus compliqué, parse que tu dois convertir des symboles en des chaînes; enfin, ça même cause une fuite des symboles, commes ils ne sont jamais enlevés du système.

    En effet, des symboles sont parfois utilisés à la place des chaînes (par exemple, comme les noms des paquets), mais ce n'est pas la façon générale de travailler avec des chaînes.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup de l' explication très utile,

    Je vais y travailler.

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    On peut résoudre le problème de façon plus fonctionnelle ou de faço plus impérative.

    Je suppose que tu es familier avec la programmation impérative et que l'algoritme impérative est plus ou moins évident. Tu peux le presenter en pseudocode. Évidemment, on doit accumuler les bons éléments en traversant la liste. Alors, ce sont une boucle et une variable accumulatrice. En lisp, il y a toutes sortes de boucles.

    Du point de vue de la programmation fonctionnelle, le probleme est un cas particulier de l'opération « sélectionner tous les éléments d'une collection d'objets que satisfont un prédicat » (un prédicat, c'est une fonction logique). Cette opération s'appelle le filtre. En mathématiques, elle est aussi très usitée, on y écrit souvent {x ∈ A: P(x)} pour désigner l'ensemble des élements de A qui satisfont P.

    Dans les notations mathématiques on peut formuler le problème {s ∈ liste: s[0] = c}, où liste et c sont la liste et la lettre données.

    En théorie, dans un langage de programmation on peut avoir une fonction générale filter qui accepte une collection d'objets et un prédicat et renvoie une nouvelle collection. Quel sera le prédicat en notre cas ? C'est une fonction qui vérifique si le premier caractère d'une chaîne s est c ou pas:

    Alors, la liste qu'on cherche, c'est tout simplement filter(liste, p).

    On voit que pour que cette solution soit possible, notre langage doit permettre de passer des fonctions comme arguments à d'autres fonctions: ici la fonction p est l'argument de filter. C'est possible même en C (au moyen des pointers).

    Mais il y a une autre complication. Pour définir p, on doit savoir c, mais le caractère c est lui même un argument de la fonction elimine; par conséquent, il n'est pas connu à la compilation. Avec C, nous voilà dans un embarras. Notre langage doit permettre de former des fonction à l'exécution.

    En outre, le prédicat p est trop spécifique, c'est une fonction jetable. C'est même une nuisance de lui attribuer un nom. Pour désigner une fonction comme ça, on peut êcrire s → (s[0] == c) et dans notre langage la solution est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elimine(liste, c) = filter(liste, s → (s[0] == c))
    Lisp est est assez avancé et il permet une solution comme ça. En lisp, les fonctions ont parfois des noms inattendus. Par exemple, filter s'appelle remove-if-not. À la place d'une aiguille on se sert du mot lambda, qui provient lui aussi des mathématiques. Pour accéder à un caractère d'une chaîne, on utilise la fonction char, et pour comparer des caractères, la fonction char=, ou bien la comparaison générique eqv. Alors, voilà le prédicat : (lambda (s) (char= (char s 0) c)). C'est curieux que cette fonction anonyme comprend aussi la variable c definie « plus haut », comme un des arguments de elimine. Mais en lisp, c'est normal. Une telle fonction est appellé une fermeture (closure en anglais).

    On peut résoudre ce probleme en utilisant la récursivité (généralement, chaque boucle peut être représenter comme une fonction récursive). Mais du point de vue de Common Lisp une telle solution soit bête et inefficace, et je ne vais pas en parler.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Je vous remercie à cette explication bien rempli.

    J'aime comment vous m'avez expliqué très clairement.

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD-2010] Selection de mots dans une liste et les mettre en rouge
    Par axelair2 dans le forum VBA Word
    Réponses: 7
    Dernier message: 01/08/2014, 14h05
  2. Réponses: 42
    Dernier message: 07/07/2012, 09h16
  3. Réponses: 2
    Dernier message: 30/01/2012, 10h40
  4. eliminer les vides dans une liste
    Par alphonse62 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 08/05/2007, 18h13
  5. [RegEx] Trouver tous les "/mot" dans une chaîne
    Par micatmidog dans le forum Langage
    Réponses: 7
    Dernier message: 31/03/2006, 12h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo