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 :

[Lisp][Débutant] Erreur incompréhensible "expected procedure"


Sujet :

Lisp

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut [Lisp][Débutant] Erreur incompréhensible "expected procedure"
    (Re)Bonjour,
    Encore un problème
    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
     
    ( define (addr ltc) 
       (cond ( (null? (cdr ltc) )  ltc)
             (else( 
                   (addr (
                          append (            
                           cons            
                           (                        
                            cons                                      
                            ( + ( car (car ltc) ) (car (car (cdr ltc) ) ) )                                              
                            (cons (+ (car (cdr (car ltc) ) ) ( car (cdr (car (cdr ltc) ) ) ) ) ())                                                     
                           )                                            
                           ()                                       
                           )                                       
                          (cdr (cdr ltc) )                                  
                          ) 
                  ) ) ) ) <- probleme)
    Je suis désolé pour l'indentation , j'ai vraiment du mal à en trouver une claire pour ce langage.

    Ce programme fait l'addition des termes d'une A-liste et retourne une a-liste d'un seul terme
    Exemple :
    (addr '( ( 2 3)(3 6)(5 6)))
    retourne :
    ((10 15))

    Le programme s'exécute pas trop mal (il crée la liste finale) mais impossible de la retourner ! Le debugueur m'indique une erreur à la parenthèse indiquée.

    Dr Sheme indique :
    procedure application: expected procedure, given: ((10 15)) (no arguments)
    Merci à vous !

  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
    Points : 6 498
    Points
    6 498
    Par défaut
    Une parenthèse de trop ici
    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
    ( define (addr ltc) 
       (cond ( (null? (cdr ltc) )  ltc)
             (else(  <=== ici parenthèse en trop la supprimer ainsi qu'une autre en bas
                   (addr (
                          append (            
                           cons            
                           (                        
                            cons                                      
                            ( + ( car (car ltc) ) (car (car (cdr ltc) ) ) )                                              
                            (cons (+ (car (cdr (car ltc) ) ) ( car (cdr (car (cdr ltc) ) ) ) ) ())                                                     
                           )                                            
                           ()                                       
                           )                                       
                          (cdr (cdr ltc) )                                  
                          ) 
                  ) ) ) ) <- probleme)
    "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 régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut
    Merci !

    J ai vraiment bcp de problemes avec ces parenthese

    Maitnenant j aimerai ajouter un bout de code au precedent programme mais tjrs la meme erreur, je ne comprends vraiment aps comment place ces parenthses pourtt je vois bien le principe du langage
    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
     
    (define (add p ltc lto lrc lro)
      (cond ( ( or (null? (cdr ltc) ) (>  ( + ( car (car ltc) ) (car (car (cdr ltc) ) ) ) p ) )   
             ( (cond ( (> (car ( cdr (car ltc) ) ) ( car( cdr (car lrc) ) ) ) lto) 
                    (else lro ) ) ) )  
             (else
                     ( add p (
                           append (
                                   cons
                                       (
                                        cons
                                           ( + ( car (car ltc) ) (car (car (cdr ltc) ) ) )
                                           (cons (+ (car (cdr (car ltc) ) ) ( car (cdr (car (cdr ltc) ) ) ) ) () ) 
                                       )
                                      ()
                                  ) 
                                  (cdr (cdr ltc) ) 
                           ) lto lrc lro )  ) ) )

  4. #4
    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
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu pourrais donner un exemple de lancement pour pouvoir tester ?

    (add ? ? ? ? ?)
    "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

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut
    Bien sur, desole j aurai du le faire tt de suite

    (add '15 '((12 3)(3 5)) '((12 3)(3 5)) '((13 3)) '(22 22))

  6. #6
    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
    Points : 6 498
    Points
    6 498
    Par défaut
    Ton erreur est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (define (add p ltc lto lrc lro)
      (cond ( ( or (null? (cdr ltc) ) (>  ( + ( car (car ltc) ) (car (car (cdr ltc) ) ) ) p ) )   
             ( (cond ( (> (car ( cdr (car ltc) ) ) ( car( cdr (car lrc) ) ) ) lto) 
                    (else lro ) ) ) )  <== parenthèse en trop, elle clot le premier cond.
    Utilises-tu DrScheme, son éditeur est bien pratique, il permet de voir la portée du parenthésage.

    Par contre, une fois corrigé, ta fonction ne donne rien, tu as une erreur d'ecriture de la fonction, qu'est-elle censée faire ?
    "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

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut
    Oui j utilises Dr Sheme mais je n ai pas vu que ma parenthese portait trop loin ...

    Le programme est cense retourner une liste lto ou lro

    Le programme fait l addition des termes d une liste, les compares avec la valeur calculée lors d un precedent appel et retourne celle qui a la plus grande valeur ( 2 terme de chaque a-liste)

    ltc = liste "additionnée" en cours d evaluation
    lto = liste d origine en cours d evaluation
    lrc = liste additionnée lors d un precedent appel qui ,pour l instant, a la plus grande valeur
    lro = liste d origine qui a la plus grande valeur

  8. #8
    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
    Points : 6 498
    Points
    6 498
    Par défaut
    J'ai oublie de te demander : Quel est le résultat attendu de
    (add '15 '((12 3)(3 5)) '((12 3)(3 5)) '((13 3)) '(22 22)) ?

    Avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    (define (add p ltc lto lrc lro)
      (cond ((or (null? (cdr ltc)) 
                 (>  (+ (car (car ltc)) (car (car (cdr ltc)))) p))   
             (cond ((> (car (cdr (car ltc))) (car(cdr (car lrc)))) lto) 
                   (else lro )))  
            (else (add p 
                       (append (cons (cons (+ ( car (car ltc) ) (car (car (cdr ltc))))
                                           (cons (+ (car (cdr (car ltc))) (car (cdr (car (cdr ltc))))) ()) 
                                           )()) 
                               (cdr (cdr ltc)))
                       lto lrc lro))))
     
    (add '15 '((12 3)(3 5)) '((12 3)(3 5)) '((13 3)) '(22 22))
    J'obtiens ((12 3) (3 5))
    "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

  9. #9
    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
    Points : 6 498
    Points
    6 498
    Par défaut
    Pour obtenir une indentation correcte tu peux faire Scheme/Réindenter !
    "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

  10. #10
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut
    Merci pour la petite astuce avec DrSheme

    J'ai oublie de te demander : Quel est le résultat attendu de
    (add '15 '((12 3)(3 5)) '((12 3)(3 5)) '((13 3)) '(22 22)) ?
    Le resultat attendu est ( (12 3)(3 5) ), je ne sais plus si c'était ce résultat qui ressortait mais en tt cas ca m a permis d'avancer et le résultat est bon maintenant

    Merci et a tt de suite pour un nouveau problème !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/11/2007, 13h28
  2. Réponses: 4
    Dernier message: 19/09/2007, 16h18
  3. Réponses: 2
    Dernier message: 23/05/2007, 11h02
  4. [débutant] erreur "indice de liste hors limites(1)"
    Par lidouka dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2005, 14h31

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