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 :

liste en plusieur sous liste


Sujet :

Lisp

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut liste en plusieur sous liste
    Bonjour je debute en lisp et j'ai un probleme avec un programme en faite j'aimerai transformer une liste en sous liste exemple
    (kakashi05) et j'aimerai obtenir ((k)(a)(k)(s)(h)(i)(0)(5))
    je vous montre mon code et quelque precision lorsque la liste est vide il me renvoi bien "vide" par contre il n'arrive pas à executé la deuxieme condition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CL-USER 17 : 6 >  (defun pointe (liste)
                      (cond 
                       ((null liste) (print "vide"))
                       (t ( cons ( car liste ) pointe ( cdr liste)))))
    POINTE
     
    CL-USER 18 : 6 > pointe ()
     
    "vide" 
    "vide"
    voila l'erreur que j'obtiens lorsque je lui passe des parametres à la liste
    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
    24
    25
     
    CL-USER 19 : 6 > pointe (kakashi05)
     
    Error: Undefined operator KAKASHI05 in form (KAKASHI05).
       1 (continue) Try invoking KAKASHI05 again.
       2 Return some values from the form (KAKASHI05).
       3 Try invoking something other than KAKASHI05 with the same arguments.
       4 Set the symbol-function of KAKASHI05 to another function.
       5 Set the macro-function of KAKASHI05 to another function.
       6 (abort) Return to level 6.
       7 Return to debug level 6.
       8 Return to level 5.
       9 Return to debug level 5.
      10 Return to level 4.
      11 Return to debug level 4.
      12 Return to level 3.
      13 Return to debug level 3.
      14 Return to level 2.
      15 Return to debug level 2.
      16 Return to level 1.
      17 Return to debug level 1.
      18 Return to level 0.
      19 Return to top loop level 0.
     
    Type :b for backtrace, :c <option number> to proceed,  or :? for other options
    si quelqu'un à une idee je suis preneur
    Merci

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    En bref tu veux transformer chaque élément de la liste d'origine en liste de 1 élément...
    En Haskell on ferait ça comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toListOfLists xs = map (\x -> [x]) xs
    En Lisp je te conseille de faire de même : utiliser mapcar (équivalent de map en Haskell) et une fonction qui prend un argument et renvoie une liste de 1 élément.

    (en Haskell on ferait plutôt "toLOfL = map (:[])" directement en fait mais bon...)

    --
    Jedaï

  3. #3
    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
    Citation Envoyé par kakashi05 Voir le message
    Bonjour je debute en lisp et j'ai un probleme avec un programme en faite j'aimerai transformer une liste en sous liste exemple
    (kakashi05) et j'aimerai obtenir ((k)(a)(k)(s)(h)(i)(0)(5))
    je vous montre mon code et quelque precision lorsque la liste est vide il me renvoi bien "vide" par contre il n'arrive pas à executé la deuxieme condition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (defun pointe (liste)
        (cond ((null liste) (print "vide"))
               (t ( cons ( car liste ) pointe ( cdr liste)))))
    Bon alors pour commencer kakashi05 c'est un seul élément syntaxique. Avec ton idée, tu n'obtiendras pas ((k)(a)(k)(s)(h)(i)(0)(5)) mais (kakashi05). Par contre tu obtiendrais ce que tu veux avec '(k a k a s h i 0 5).

    Si on est d'accord avec ça, en ne gardant pas l'idée de Jedaï car il faudrait que tu en sois rendu là dans ton cours et bien que sa solution proposée soit ultimement le meilleur choix, il me semble que tu as la bonne idée, mais que tu as fais une simple erreur de syntaxe qui buste tout ton programme. Je te rappelle qu'en LISP on préfixe les opérateurs et les fonctions.

    Sinon, bien entendu, (print "vide") ne saurait être une valeur à retourner.

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut
    je vous remercie pour vos reponses mais je pense que je suis tres proche de la solution lol et c'est vrai qu'il faut que je note '(k a k a s h i 0 5) deja

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut
    J'ai trouvé la solution et j'avais un peu oublier de mettre la correction apres avoir fait de nombreux test voila le resultat que j'ai obtenu merci à vous tous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CL-USER 4 : 1 > (defun pointe (liste)
                       (cond 
                        ((null liste) ())
                        (t (cons (cons (car liste) ()) (pointe (cdr liste)))
                           )))
    POINTE
     
    CL-USER 5 : 1 > (pointe '(k a k a s h i 0 5))
    ((K) (A) (K) (A) (S) (H) (I) (0) (5))

  6. #6
    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
    Sais-tu que pour créer une liste, tu disposes aussi de la fonction list ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (defun pointe (liste)
        (cond 
            ((null liste) ())
            (t (cons (list (car liste)) (pointe (cdr liste))) )))
    Ça ne change pas grand chose cependant. Ton code est correct cette fois.

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut
    voila une autre maniere de le faire avec la commande liste mais je l'a trouve un peu compliquer voila pourquoi j'ai preferer l'afficher l'autre bref voila le code et merci à vous tous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CL-USER 6 : 1 > (defun pointe (mot)
    (cond ((null mot) 'vide)
    (t (append (list(cons(car mot)())) (pointe (cdr mot))))))
    POINTE
     
    CL-USER 7 : 1 > (pointe '(k a k a s h i 0 5))
    ((K) (A) (K) (A) (S) (H) (I) (0) (5) . VIDE)

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    La façon à mon avis la plus propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (defun pointe (mot) (mapcar (lambda (x) (list x)) mot))
    --
    Jedaï

  9. #9
    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
    Citation Envoyé par Jedai Voir le message
    La façon à mon avis la plus propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (defun pointe (mot) (mapcar (lambda (x) (list x)) mot))
    --
    Jedaï
    Mais encore faut-il que le cours en soit arrivé à la programmation par flots (les map et autres). Peut-être que son prof veut d'abord faire faire le travail à la main.

    Sinon c'est clairement la plus élégante et la plus intelligente. Surtout que certain compilateur ont des versions internes optimisées de map si je ne me trompe pas.

  10. #10
    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
    Citation Envoyé par kakashi05 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (defun pointe (mot)
    (cond ((null mot) 'vide)
    (t (append (list(cons(car mot)())) (pointe (cdr mot))))))
    Celui-ci est un très mauvais choix. Comme tu le liras souvent, on évite au possible l'utilisation de la fonction append. En plus c'est contre intuitif de faire une liste pour utiliser append alors que cons fait exactement ce que tu veux : rajouter un élément en début de liste.

  11. #11
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Points : 36
    Points
    36
    Par défaut
    Je vous remercis pour toutes ses precisions c'est vrai qu'on avait pas fait les mapcar et c'est vrai que c'est propre avec les mapcar
    Merci

  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 Jedai Voir le message
    La façon à mon avis la plus propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (defun pointe (mot) (mapcar (lambda (x) (list x)) mot))
    --
    Jedaï
    Personnellement et en ce qui me concerne moi-même, j'aurais une légère préférence pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (defun pointe (mot) (mapcar 'list mot))
    Qui dit mieux?

    Bon, d'accord, ça ne rajoute pas grand-chose... mais, comme dirait Pierre Cointe:

    Un programme est terminé non pas quand il ne reste plus rien à ajouter, mais lorsqu'il ne reste plus rien à retirer.
    )jack(

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

Discussions similaires

  1. [Toutes versions] Excel: Liste de plusieurs sous ensembles par article
    Par HellVetik dans le forum Excel
    Réponses: 8
    Dernier message: 12/05/2015, 18h01
  2. [Python 2.X] liste, distributivité et sous liste
    Par loblique dans le forum Général Python
    Réponses: 6
    Dernier message: 18/12/2014, 14h05
  3. Parcours de listes et de sous listes.
    Par alcibiade dans le forum Lisp
    Réponses: 8
    Dernier message: 09/05/2011, 23h19
  4. Des listes et ses sous listes
    Par {F-I} dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 23/10/2008, 07h06
  5. Réponses: 5
    Dernier message: 06/05/2007, 18h29

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