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 :

débutants en rade face au "let"


Sujet :

Scheme

  1. #1
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 406
    Points : 92
    Points
    92
    Par défaut débutants en rade face au "let"
    bonjour à tous
    on vient de passer une demi heure à pleurer car ça ne marchait pas
    quelqu'un peut il nous dépanne r?
    merci !
    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
    20
    (define (x1x2 a b c)
      (
       let (
            (b2 (* b b)) 
            (ac4 (* 4 a c))
            (delta (- b2 ac4))
           )
       
       (cond
         ((> delta 0) "deux solutions")
         ((= delta 0) "une solution")
         ((< delta 0) "aucune solution")
         (else "")
        )
       
       
      )
    )
    
    (x1x2 1 2 -1)

  2. #2
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Le Problème :

    Les variables b2 et ac4 ne sont définies qu'à l'intérieur du corps du let.
    Cela signifie que lors de la déclaration de delta, les variables b2 et ac4 ne sont pas encore définies.

    Solution n°1 :

    Sans doute celle qu'on attend de toi.
    Dans le corps du 1ier let, insérer un 2nd let où l'on déclare delta.

    Solution n°2 :

    Pour les tricheurs habitués de Scheme.
    Utiliser let* à la place du simple let.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  3. #3
    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 SpiceGuid Voir le message
    Les variables b2 et ac4 ne sont définies qu'à l'intérieur du corps du let.
    Cela signifie que lors de la déclaration de delta, les variables b2 et ac4 ne sont pas encore définies.
    Farpaitement!

    Dans le temps, en Le_Lisp, let était une macro qui s'expansait en une lambda.

    La macro-expansion de ce code-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (define (x1x2 a b c)
      (let ((b2 (* b b))
            (ac4 (* 4 a c))
            (delta (- b2 ac4)))
       (cond
         ((> delta 0) "deux solutions")
         ((= delta 0) "une solution")
         ((< delta 0) "aucune solution")
         (else ""))))
    donnait donc quelque chose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (define (x1x2 a b c)
      ((lambda (b2 ac4 delta)
         (cond
          ((> delta 0) "deux solutions")
          ((= delta 0) "une solution")
          ((< delta 0) "aucune solution")
          (else "")))
       (* b b) (* 4 a c) (- b2 ac4)))
    Or, on voit bien ici qu'on ne peut pas calculer (- b2 ac4) avant d'avoir affecté des valeurs à b2 et ac4.

    On dit aussi parfois que les valeurs des variables du let sont d'abord toutes calculées puis affectées en parallèle aux variables du let.

    C'est juste une autre manière de dire la même chose que SpiceGuid

  4. #4
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 406
    Points : 92
    Points
    92
    Par défaut
    salut ;
    merci
    en fait c'est déstabilisant au premier abord je trouve
    j'ai essayé ceci mais ça ne fonctionne pas :
    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
    20
    21
    22
    23
    (define (x1x2 a b c)
      (
       let (
            (b2 (* b b)) 
            (ac4 (* 4 a c))
            (let 
              (
               (delta (- b2 ac4)))
              )
           )
       
       (cond
         ((> delta 0) "deux solutions")
         ((= delta 0) "une solution")
         ((< delta 0) "aucune solution")
         (else "")
        )
       
       
      )
    )
    
    (x1x2 1 2 -1)
    par contre le let* fonctionne très bien
    y a til une page en français qui explique en détail les différences entre les deux ? le let *, si j'ai bien compris, rend les variables globales ?

    en fait ce que je comprend pas c'est que :
    quand j'appelle la fonction x1x2 à la fin
    il lit ce que la fonction contient, ce qui la définit
    et il commence par lire le let qui lui définit chronologiquement b2, puis ac4 (on ne peut pas donner comme nom de variable 4ac apparemment), puis delta
    alors en fait je ne saisi pas à quel endroit il se trouve face à une variable non définie...

    Vincent

  5. #5
    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 elodouwen Voir le message
    salut ;
    merci
    en fait c'est déstabilisant au premier abord je trouve
    j'ai essayé ceci mais ça ne fonctionne pas :
    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
    20
    21
    22
    23
    (define (x1x2 a b c)
      (
       let (
            (b2 (* b b)) 
            (ac4 (* 4 a c))
            (let 
              (
               (delta (- b2 ac4)))
              )
           )
       
       (cond
         ((> delta 0) "deux solutions")
         ((= delta 0) "une solution")
         ((< delta 0) "aucune solution")
         (else "")
        )
       
       
      )
    )
    
    (x1x2 1 2 -1)
    Tu ne peux pas mettre le "let" dans les variables du "let" (en tout cas, pas pour ce que tu veux faire (pour simplifier)).

    Je t'invite à relire mon dernier post...

    Ce dont tu aurais besoin, ce serait quelque chose comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (define (x1x2 a b c)
      ((lambda (b2 ac4)
         ((lambda (delta)
            (cond
             ((> delta 0) "deux solutions")
             ((= delta 0) "une solution")
             ((< delta 0) "aucune solution")
             (else "")))
          (- b2 ac4)))
       (* b b) (* 4 a c)))
    C'est-à-dire appliquer la "lambda" à 2 paramètres (b2 et ac4) aux valeurs de (* b b) et (* 4 a c)
    puis, dans le corps de cette "lambda", demander l'application d'une "lambda" à un paramètre (delta), appliquée à la valeur de (- b2 ac4) qui sont connus dans le corps de la "lambda" appelante.

    Peux-tu imaginer comment l'écrire avec des "let"s?

    par contre le let* fonctionne très bien
    Oui. C'est effectivement ce qu'on t'a expliqué!

    y a til une page en français qui explique en détail les différences entre les deux ?
    Il existe un serveur qui s'appelle "google" et qui permet de chercher ce genre de chose...
    Peut-être en essayant de lui passer une requête comme:
    lisp différence entre let et let*
    https://www.google.fr/?gws_rd=ssl#q=...re+let+et+let*
    Ah! Ben, tiens, ça marche!
    => www.algo.be/logo1/lisp/intro-lisp.pdf (voir p17)

    Bon, d'accord, c'est la 4ème entrée... c'est peut-être un peu loin...

    le let *, si j'ai bien compris, rend les variables globales ?
    Pas du tout!
    Je t'invite à relire les différentes réponses et à demander ce que tu n'y comprends pas.

    en fait ce que je comprend pas c'est que :
    quand j'appelle la fonction x1x2 à la fin
    il lit ce que la fonction contient, ce qui la définit
    et il commence par lire le let qui lui définit chronologiquement b2, puis ac4 (on ne peut pas donner comme nom de variable 4ac apparemment), puis delta
    alors en fait je ne saisi pas à quel endroit il se trouve face à une variable non définie...
    Peut-être en relisant mon dernier post...

  6. #6
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 406
    Points : 92
    Points
    92
    Par défaut
    j'avais oublié le côté toujours ironique des pros sur les forums spécialisés…
    je vais me plonger là dedans et tenter de dénouer l'écheveau
    si j'ai des questions plus précises, je reviendrai
    merci d'avoir répondu en tous cas
    VD

  7. #7
    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 elodouwen Voir le message
    j'avais oublié le côté toujours ironique des pros sur les forums spécialisés…
    Oops!
    J'espère que je ne t'ai ni blessé ni dégouté car telle n'était mon intention!
    J'avais juste besoin d'un peu de légèreté dans ce monde de lambdas...

    je vais me plonger là dedans et tenter de dénouer l'écheveau
    si j'ai des questions plus précises, je reviendrai
    J'espère bien!

    merci d'avoir répondu en tous cas
    Et merci d'avoir demandé!

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