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

  1. #1
    Membre actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    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é
    _""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 35
    Points : 63
    Points
    63
    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 actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    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 .
    _""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    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 actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    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 .
    _""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    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 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
    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.

  8. #8
    Membre actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    Par défaut
    Sérieux , c'était beaucoup plus simple que çà , en fait , il y a une astuce à inclure dans ma fonction : en transformant une valeur en un caractère puis ensuite en chaine de caractères ==> (char (string x) 0) et bien entendu , j'ai crée un prédicat avec equal .

    Merci pour vos infos aussi

    Y'a une chose qui retient mon attention , c'est l'utilisation du eq qui parait très simple ...
    _""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """

  9. #9
    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
    Citation Envoyé par Kurodiam Voir le message
    Sérieux , c'était beaucoup plus simple que çà , en fait , il y'a une astuce à inclure dans ma fonction : en transformant une valeur en un caractère puis ensuite en chaine de caractères ==> (char (string x) 0) et bien entendu , j'ai crée un prédicat avec equal .
    A vrai dire, je ne l'ai pas tout à fait compris, mais ça peu importe, puisque le problème est resolu. It semble que tu as transformé un symbole dans une chaîne de caractères et ensuite tu en as pris le premier. C'est parfait bien que ce soit bizarre d'utiliser des symboles au lieux des chaînes de caractères. Pour comparer les charactères il faudrait mieux employer EQL ou CHAR=, car elles sont plus spécifiques.

  10. #10
    Membre actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    Par défaut
    Citation Envoyé par byjav Voir le message
    A vrai dire, je ne l'ai pas tout à fait compris, mais ça peu importe, puisque le problème est resolu. It semble que tu as transformé un symbole dans une chaîne de caractères et ensuite tu en as pris le premier. C'est parfait bien que ce soit bizarre d'utiliser des symboles au lieux des chaînes de caractères. Pour comparer les charactères il faudrait mieux employer EQL ou CHAR=, car elles sont plus spécifiques.

    Oui , je peux comprendre çà , ce n'est pas évident à capter, en fait , l'idée et la difficulté vient ""de comparer un caractère et un symbole"" .

    Mais en surfant sur le net, j'ai vu les fonctions spécifiques dont tu parles (et y'a la même chose avec string) , mais en cours , on n'en parle pas encore , et ben çà veut dire que c'est surement un palier plus haut !
    _""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """

  11. #11
    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
    Comparer un caractère a un symbole, c'est très simple: ils ne sont ni EQ, ni EQL, ni EQUAL, ni EQUALP. C'est la même chose que comparer un kilo à un mètre.

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Kurodiam Voir le message
    mais en cours , on n'en parle pas encore , et ben çà veut dire que c'est surement un palier plus haut !
    "un pallier plus haut" me fait penser à un niveau de difficulté supplémentaire.
    Il y a tellement de fonctions en lisp (voir l'index de l'hyperspec)!
    Il y a une exploration "en largeur" (voir de nouvelles fonctions simples) et une exploration "en profondeur" (voir de nouveaux concepts et des fonctions complètement différentes)...
    Bref, ce n'est pas parce que tu n'as pas encore vu une fonction qu'elle est nécessairement "un pallier plus haut"!
    Elle peut juste être un pas à côté du chemin sur lequel t'invite ton prof...

    Rq: "aref" est la fonction d'accès aux éléments d'un vecteur ("array"). Comme une "string" est un cas particulier de vecteur (une "sous-classe" en quelque sorte), on peut lui appliquer "aref".
    CL fournit aussi des accesseurs spécifiques aux chaines de caractères comme "char", qui provoque une erreur si on tente de l'appliquer à un "array" qui n'est pas une "string".
    mais... j'avais "oublié" l'existence de cette fonction et ne l'ai pas retrouvée en feuilletant rapidement l'hyperspec.
    Merci à byjav de me l'avoir rappelée. Du coup, la meilleure forme étant, à mon sens, celle qu'il a proposée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (char= (char s1 0) (char s2 0))

  13. #13
    Membre actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    Par défaut
    Cool


    Pour revenir à mon exo , il faut extraire le caractère qu'on veut comparer.

    Partons de (setq liste '(navrant heureux)).

    Si je fais (string (car liste), j'aurai l'atome navrant , mais ce que je veux c'est la chaîne heureux.
    Pour ça tu fais : (string (cadr liste)).

    Maintenant il faut que je puisse comparer seulement le N de navrant, et donc il faut utiliser char :

    (char (string (car liste)) 0) renvoie alors bien #\N

    Maintenant si je veux comparer (char (string (car liste)) 0) avec N je dois transformer N pour qu'il soit lui aussi sous forme #\N (sinon je compare un caractère et un atome et c'est impossible bien entendu ).

    Alors je reprends la formule :

    (char (string -mon caractère-) 0) ==> j'obtiens la forme #\N.


    Voici deux tests pour te montrer @byjav :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (setq liste '(chichi chimere sage))
    (chichi chimere sage)
     
    (setq caractère 'c)
    c
     
    (string (char (string (car liste)) 0))                - on a bien un caractère, le premier de 'chichi'
    "c"
     
     
    (string caractère)                                        - c'est un caractère, c convertit
    "c"
    _""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """

  14. #14
    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
    Bon, il est assez bête, ton exo, comme d'habitude. (Naturellement, ce n'est pas ta faute).

  15. #15
    Membre actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    Par défaut
    Est-ce que tu connais des liens sur des exercices corrigés ?
    Ce serait un rêve si çà existe
    _""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """

  16. #16
    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
    Moi, je n'en connais rien. Je ne suis pas tellement intéressé aux exercices...

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Je ne connais pas de lien vers des exercices lisp avec corrigés.
    J'imagine que ça doit se trouver sur internet!
    Sur ce forum, il y a quelques (vieilles) références:
    http://www.developpez.net/forums/d11...n/#post6148115
    http://www.developpez.net/forums/d10...p/#post5758493

    Sinon, tu peux aussi regarder les divers posts de ce forum. Beaucoup d'entre eux sont des demandes d'aide pour des problèmes simples que tu peux "t'amuser" à résoudre toi-même!

    Cliquer sur Forum lisp
    Cliquer sur Forum scheme

  18. #18
    Membre actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    Par défaut
    Merci pour les liens .
    En fait , en parallèle , j'ai cherché des tutos , et figures que certains mettent des codes qui ne tournent même pas donc c'est pas cool
    _""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """

  19. #19
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Kurodiam Voir le message
    certains mettent des codes qui ne tournent même pas donc c'est pas cool
    Cela peut être un excellent exercice: comprendre pourquoi le code ne marche pas et le corriger!
    Et, si tu n'y arrives pas, tu peux toujours poster une question sur ce forum!

  20. #20
    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
    Ceci est beaucoup plus intéressant: http://www.gigamonkeys.com/book/ Il n'y a pas d'exercices, mais il y a du bon Common Lisp.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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