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

Scheme Discussion :

Renvoi d'erreur


Sujet :

Scheme

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut Renvoi d'erreur
    Bonsoir , j'ai écrit une fonction qui calcule la somme des entiers entre x et y , mais qui me renvoie une erreur si x est supérieur à y , regardez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (define (somme x y)
      (if (> x y)
          (erreur 'somme
                  "(" x ") >"
                  "(" y ")"
                  )
          )
      (+ y (somme x (- y 1) ))
      )
    alors c'est drole car si je fais (somme 5 3) , ça va bien me renvoyer une erreur , mais si je fais (somme 3 5) ça me renverra une erreur aussi , pourtant j'ai bien pris soin de sortir la fonction récursive du if pour éviter ce genre de probleme , mais rien n'y fait , vous avez une idée ?

    merci

  2. #2
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Parce que tu décrémentes y et eventuellement il devient plus petit que x, donc erreur.

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    oui je sais mais alors comment afficher mon erreur tout en gardant ma fonction récursive ?

  4. #4
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Quel genre d'addition permet pas que son premier argument soit plus grand que son second? Je trouve l'idée complètement ridicule.

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    moi je dois résoudre un exercice qui me renvoit la somme des entiers entre x et y si x plus petit que y et qui me renvoit une erreur si x plus grand que y , c'est tout...je fais les exercices que je dois faire ...

  6. #6
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Fais le en deux fonctions. Une qui fait l'addition et l'autre qui fait l'appel de cet fonction seulement si (> x y)

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    seulement si (> y x) tu voulais dire

  8. #8
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    bon j'ai comrpris ce que tu voulais dire , je sais le coder mais regarde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (define (somme2 x y)
      (if (< x y)
       (somme1 m n)
        (erreur 'somme2
                  "(" x ") >"
                  "(" y ")"
                  )
          )
      )
    la fonction somme1 c'est elle qui fait la somme lais elle est codée dans un autre fichier , je peux recopier le code de la fonction sur ce code si en imbriquant un second define ?
    merci

  9. #9
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    j'ai essayé ça marche , merci gnu , mais je trouve ça un peu lourd comme code j'ai du faire un cc d'une fonction dans celle ci ...

  10. #10
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Pas besoin de la copier si tu l'as déjà; appelle la.

  11. #11
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    et si j'ai été obligé de faire le cc de LA fonction dans MA fonction sinon yavait une erreur undefinited...

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    C'est pas grave que pour l'instant tes fonctions soient un peu patates -_- ce qui compte c'est que tu trouves des solutions à tes problèmes.

    La gestion d'erreur en Scheme peut être faite de manière beaucoup plus élégante avec la programmation par continuation. Mais là, c'est sérieusement plus difficile que où tu en es rendue. Attendons donc

    Normalement, une fois que tout marche, on intègre la fonction « somme 1 » dans la fonction « somme 2 » (pis on trouve d'autres noms parce que c'est pas géant).

    Première méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (define (somme2 x y)
      (define (somme1 m n) corps-somme-1)
      (if [< x y]
          (somme1 m n)
          (erreur 'somme2
                  "(" x ") >"
                  "(" y ")"
                  )
          )
      )
    Deuxième méthode (si tu as vu l'opérateur lambda, ce qui ne semble pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (define (somme2 x y)
      (let ({somme1 (lambda (m n) corps-somme-1)}
            )
        (if [< x y]
            (somme1 m n)
            (erreur 'somme2
                    "(" x ") >"
                    "(" y ")"
                    )
            )
        )
      )
    Une dernière méthode consiste à laisser la fonction auxiliaire « somme1 » en dehors de « somme2 » mais à en capturer le comportement dans ce qu'on appelle la fermeture de « somme2 ». C'est la meilleure méthode.
    Et au passage je les rebaptise.
    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
    (define (somme-sans-gestion-erreur m n) corps-somme-sans-gestion-erreur)
    
    (define somme-avec-gestion-erreur 
      (let ({somme-aux somme-sans-gestion-erreur})
        (lambda (x y)
          (if [< x y]
              (somme-aux m n)
              (erreur 'somme2
                      "(" x ") >"
                      "(" y ")"
                      )
              )
          )
        )
      )
    Si tu n'as pas vu le lambda, oublie pour l'instant.
    (PS. au passage, bravo, ton code est bien plus lisible.)

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 29/01/2008, 15h28
  2. [PHPMailer] N'envoie pas d'e-mail ou renvoie une erreur
    Par stanko77 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 11/07/2007, 20h31
  3. [JVCL] install.bat de JCL renvoie une erreur
    Par Gaadek dans le forum Delphi
    Réponses: 3
    Dernier message: 08/06/2007, 15h56
  4. Requete sql vers ORACLE qui renvoi une erreur
    Par lilou77 dans le forum Oracle
    Réponses: 7
    Dernier message: 29/01/2007, 09h52
  5. [C#] [WinForms] Renvoi des erreurs...
    Par omlip dans le forum Windows Forms
    Réponses: 7
    Dernier message: 08/12/2004, 17h12

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