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 :

Programmation lisp [Débutant(e)]


Sujet :

Lisp

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut Programmation lisp
    Bonjour ,

    Je débute en lisp et j'esseye depuis une bonne semaine maintenant d'écrire une simple fonction somme qui réalise la sommes des éléments. Sauf que si les éléments sont des caractères il le modifie en chiffre pour exécuter la somme tel que :
    ex : (somme '(1 2 3 a b)) donne 9 soit 1+2+3+1+2 .
    (somme '(1 2 3 a z)) donne 33 soit 1+2+3+1+26.

    J'utilise lispWork 4.2.0 , Merci d'avance de votre aide.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Quel est le résultat attendu pour (somme '(1 2 3 a b)) ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut
    • (somme '(1 2 3 a b)) = 9
      (somme '(1 2 3 a z)) = 33


    Lorsque je rencontre une lettre je veux le remplacer par :a = 1 , b = 2 , c = 3 .... z=26 , pour pouvoir faire la somme

  4. #4
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    personnellement j'utilise emacs et son lisp

    Avec ce code j'arrive au résultat que tu attendu (ce n'est pas la panacée)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (defconst a 1)
    (defconst b 2)
    (defconst c 3)
    ...
    (defconst z 26)
     
    (message "%d" (+ 1 2 3 a b))
    cela donne: 9

    tu peux aussi jeter un œil sur (apply ...) qui permet d'appliquer une fonction sur un ensemble.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut
    Voila ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (defun Somme (liste)
    (apply '+ liste)
    )
    (somme '(1 2)) = 3

    J'ai réussi a additionner les chiffres mais j'ai encore des soucis avec les lettres . Même si je définis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    (defvar a 1)
    (defvar b 2)
    (defvar c 3)
    ...
    (defvar z 26)
    Puis je test la fonction

    J'ai une erreur

    Error: In + of (6 AB) arguments should be of type NUMBER.
    J'ai l'impression qu'il n'arrive pas a prendre la valeur des variables que j'ai définie il le traduit en caractères , quelqu'un aurait la réponse?

  6. #6
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    il est a noté que ici on a définit des variables (const dans mon cas) a,b,c …

    un caractère se représente plutôt de la façon suivante #\x pour 'x'

    Exemple (remplacement de 'u' par 'o' dans une chaine)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (substitute #\u #\o "Groucho Marx")
    -> "Gruuchu Marx"
    Si tu dois vraiment utiliser des caractères ta liste en entrée devrait être

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut
    Je vous donne une précision sur ce que j'entends moi par caractères .

    "Si les éléments sont des atomes caractères, il faut transformer les caractères en chiffre puis faire la somme "

    Il faut ma fonction résout "a = 1" et non pas "#\a = 1"

    Lorsque je définie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (defvar a 1)
    (defvar b 2)
    Et que je n'utilise pas la fonction somme mais je fais simplement :

    J'ai le bon résultat . Mais dès lors j'utilise la fonction que j'ai publié dans les messages précédents , j'ai une erreur

  8. #8
    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,

    Citation Envoyé par zaricot Voir le message
    J'ai réussi a additionner les chiffres mais j'ai encore des soucis avec les lettres . Même si je définis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    (defvar a 1)
    (defvar b 2)
    (defvar c 3)
    ...
    (defvar z 26)
    Puis je test la fonction

    J'ai une erreur



    J'ai l'impression qu'il n'arrive pas a prendre la valeur des variables que j'ai définie il le traduit en caractères , quelqu'un aurait la réponse?
    Tu as répondu en partie au problème, tu évalue le symbole plutôt que son affectation.

    Pour mieux comprendre évalue, les expressions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    '(1 2 3 a b) retoune (1 2 3 A B)
    (list 1 2 3 a b) retourne (list 1 2 3 1 2)
    Le symbole ’(quote) retoune la liste tel que définie, dans ce cas tu n’évalue pas tes variables , pour définir ta liste contenant des variables utiles la fonction list:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (somme (list 1 2 3 a b)) retourne 9
    A+

  9. #9
    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
    Créer plus de vingt variables globales inutiles c'est pas rationnel. Une seule hash-table est suffisante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    (defparameter *symb-num* (let ((h (make-hash-table)))
                               (dolist (x '((a . 1)
                                            (b . 2)
                                            (c . 3)
                                            (z . 26))) ; y en ajouter davantage
                                 (setf (gethash (car x) h) (cdr x)))
                               h))
     
    (defun somme (seq)
      (reduce #'(lambda (acc x)
                  (if (symbolp x)
                      (let ((num (gethash x *symb-num*)))
                        (if num
                            (+ acc num)
                            (error "Unexpected symbol in summation.")))
                      (+ acc x)))
              seq
              :initial-value 0))

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Il n'y a aucune possibilité de créer automatiquement la valeur associée en allant chercher des codes associés aux atomes (le code ascii par exemple) ou pouvoir faire une opération du style atome - a + 1 par exemple ?
    Je ne connais pas assez la syntaxe ni les fonctions de Lisp pour l'écrire
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  11. #11
    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
    Bonsoir,

    Si on souhaite limiter le nombre de variable globale une alternative à l’emploie de la fonction gethash et d’une table de hachage.

    Ce serait par l’emploie d’une simple liste d’association constitué de paires pointé (cons) dont le car est la clé et le cdr la valeur à associer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (defparameter
      *symb-num*
      '((a . 1)
        (b . 2)
        (c . 3)
        (z . 26)
       )
    )
    Exemple pour extraire au moyen de la fonction assoc la valeur associé à la clé b dans la liste d’association *symb-num* :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (cdr (assoc 'b *symb-num*))
    -> 2

  12. #12
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par byjav Voir le message
    Créer plus de vingt variables globales inutiles c'est pas rationnel. Une seule hash-table est suffisante :
    Cela dépend du contexte, ici on est dans un cas de cours donc il a peu d'importance.

    l'utilisation d'une table de hash sera plus souple et évolutif, mais la contrepartie est d'induire du traitement/calcul supplémentaire lors de l’exécution par rapport a l'utilisation d'un nombre de constante finie.

    A noter que un fichier définissant des constantes peut facilement se générer par un script et être inclu dans le programme.

    Me concernant pour ce cas (un apprentissage du langage) les deux approches sont valables. (pour un problème analogue dans un langage type C/C++ j'aurais probablement défini un type énuméré qui n'est pas disponible en lisp)

  13. #13
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Il n'y a aucune possibilité de créer automatiquement la valeur associée en allant chercher des codes associés aux atomes (le code ascii par exemple) ou pouvoir faire une opération du style atome - a + 1 par exemple ?
    Je ne connais pas assez la syntaxe ni les fonctions de Lisp pour l'écrire
    Citation Envoyé par Zarricot
    Il faut ma fonction résout "a = 1" et non pas "#\a = 1"
    visiblement il ne veut pas traiter des caractères....

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

Discussions similaires

  1. Programmer en lisp sur autocad
    Par jakeharper dans le forum Lisp
    Réponses: 4
    Dernier message: 17/07/2017, 14h18
  2. Réponses: 5
    Dernier message: 24/04/2015, 09h00
  3. programme lisp rectangle plus texte
    Par samiste dans le forum Lisp
    Réponses: 9
    Dernier message: 19/11/2008, 00h07
  4. programme en lisp
    Par imad18 dans le forum Lisp
    Réponses: 2
    Dernier message: 21/04/2008, 15h07
  5. programmation orienté objet en lisp
    Par ngsene dans le forum Lisp
    Réponses: 3
    Dernier message: 06/11/2007, 23h22

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