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 :

String et char : signification et utilisation


Sujet :

Lisp

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Par défaut String et char : signification et utilisation
    Bonjour,


    Comment fait t-on pour comparer un caractère avec une liste formée bien entendu d'atomes( qui sont des mots en fait ) qui sont deux types d'objets différents ?
    La seule manière serait de comparer deux caractères pour après former une nouvelle liste d'atomes .
    Je découvre pour la première ces deux types d'objets qui sont char et string .
    J'ai fait plusieurs tests comme par ex : (char (string (cadr liste)) 0) ....
    Un objet string est un symbole et comme fonction ne prend qu'un seul argument et char est un caractère , et comme fonction prend deux arguments .

    PS : je le dis juste comme çà pour prévenir d’éventuelles personnes malveillantes , ce n'est pas en ridiculisant une personne qu'on lui apprend le savoir .Y'a certains qui font çà dans d'autres forums et c'est pas trés cool pour une personne en pleine phase d'apprentissage ...
    Je suis débutante en lisp , et je viens de commencer la fameuse récursivité

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 35
    Par défaut
    Bonjour,
    Peux-tu reformuler plus clairement ta question, voire même poser quelques lignes de code, j’avoue avoir du mal à te suivre…
    A+

  3. #3
    Membre très actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Par défaut
    Citation Envoyé par Bruno-Vdh Voir le message
    Bonjour,
    Peux-tu reformuler plus clairement ta question, voire même poser quelques lignes de code, j’avoue avoir du mal à te suivre…
    A+



    Mon objectif est de comparer déjà si 2 chaines de caractères commencent par un même caractère et une fois çà , je dois créer une nouvelle liste incluant des mots en fonction de ce prédicat .

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Kurodiam Voir le message
    Mon objectif est de comparer déjà si 2 chaines de caractères commencent par un même caractère et une fois çà , je dois créer une nouvelle liste incluant des mots en fonction de ce prédicat .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ELISP> (setq str1 "chou")
    "chou"
    ELISP> (setq str2 "coucou")
    "coucou"
    ELISP> (eq (aref str1 0) (aref str2 0))
    t
    ELISP> (eq (aref str1 1) (aref str2 1))
    nil
    Attention! S'il s'agit de symboles et non de chaines, il faut prendre leur nom pour obtenir une string (manipulable avec aref)!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ELISP> (setq s1 'chou)
    chou
    ELISP> (setq s2 'coucou)
    coucou
    ELISP> (eq (aref (symbol-name s1) 0) (aref (symbol-name s2) 0))
    t

  5. #5
    Membre très actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Par défaut
    En cours , je n'ai pas encore vu la fonction aref mais j'ai saisi que (symbol-name truc) => "truc" .Pourtant , je sais qu'il faut que j'arrive à comparer un caractère et un symbole .

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Kurodiam Voir le message
    En cours , je n'ai pas encore vu la fonction aref mais j'ai saisi que (symbol-name truc) => "truc" .Pourtant , je sais qu'il faut que j'arrive à comparer un caractère et un symbole .
    Je ne vois pas bien comment faire autrement!

    L'hyperspec (la bible, quoi) dit:

    A string is a specialized vector whose elements are of type character or a subtype of type character. When used as a type specifier for object creation, string means (vector character).
    La manière normale (et probablement unique) d'accéder au N+1ème caractère d'une chaîne STR est, comme indiqué précédemment (aref N STR) où N == 0 correspond au 1er élément.

    Si tu veux comparer 2 chaines entre elles, tu peux utiliser un prédicat comme string< ou l'un de ceux décrits dans la page http://www.lispworks.com/documentati...y/f_stgeq_.htm

    Si tu veux comparer un caractère d'une string avec un caractère, l'utilisation de aref est le meilleur moyen!
    (encore qu'il soit possible d'utiliser string< avec make-string)

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 153
    Par défaut
    En Common Lisp il y a quelques opérateurs qui testent l'identité en plusieurs sens, à savoir quatre opérateurs génériques, EQ, EQL, EQUAL, EQUALP, et leur cas particulier comme =, CHAR=, STRING=, STRING-EQUAL, etc. EQ compare les pointeurs, alors il est utilisé pour la plupart pour comparer les symboles, car il n'est pas garanti que deux caractères #\a ont le même pointeur. L'operatéur EQL est aussi applicable aux caractères et aux nombres d'une façon naturelle, donc (eql #\a #\a) donne T. EQUAL manipule naturellement des donnés composés telles que listes ou tableaux.

    String est un cas particulier d'array, donc on peut en extraire des caractères à l'aide de la fonction générale AREF ou bien d'une fonction speciale CHAR.

    Alors, on compare les premiers caractères de deux chaînes comme ça: (eql (char s1 0) (char s2 0)) ou (char= (char s1 0) (char s2 0)). Si s1 ou s2 est vide, ça produit un erreur.

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

Discussions similaires

  1. [DEBUTANT] String et char, bug
    Par FinalSpirit dans le forum Débuter
    Réponses: 15
    Dernier message: 10/01/2006, 18h42
  2. Borland + sqlite (aducom) + string > 256 char = pas conte
    Par spyroux dans le forum C++Builder
    Réponses: 1
    Dernier message: 16/12/2005, 22h48
  3. Evaluation d'une variable string ou char* en C++
    Par Coelacanthe dans le forum SL & STL
    Réponses: 2
    Dernier message: 08/11/2005, 09h27
  4. Convertir String en Char: comment?
    Par nmathon dans le forum Langage
    Réponses: 2
    Dernier message: 22/08/2005, 20h58
  5. [Debutant(e)]limitation du String 65536 char
    Par srane dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 28/05/2004, 23h42

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