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 :

Un bug d'Allegro CL sur la fonction "sort" ?


Sujet :

Lisp

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Un bug d'Allegro CL sur la fonction "sort" ?
    Bonjour

    c'est certainement présomptueux de parler de "bug" au sujet d'un environnement (Allegro CL) que je découvre tout juste. Mais, de mon point de vue, c'est ainsi que je le perçois... et c'est pour cette raison que je me tourne vers vous pour avoir votre avis...

    Pour vous situer mon contexte, j'ai réalisé des développements en AutoLisp pour ajouter des fonctions utiles aux besoins de mon bureau d'études. Et j'ai découvert Lisp à cette occasion.

    J'ai trouvé ce langage si "différent" (dans le bon sens) que j'ai eu envie de le pratiquer en dehors d'AutoCad.

    J'ai trouvé "Allegro CL 8.2 Free Express Edition"... je ne sais pas ce que ça vaut ni en quoi consistent les limitations, ni ce que permet les versions payantes.

    Avant de m'embarquer dans des trucs et des machins, je fais des essais "brut d'installation", en écrivant des bouts de programme dans un fichier texte (par l'éditeur Allegro, mais c'est pas obligé) et en les chargeant et les exécutant dans la fenêtre Listener... et rien de plus

    ....


    Et donc, je rencontre ce problème de "sort" et même de "stable-sort" qui donnent des résultats curieux...

    voici un petit bout de code avec les tris :


    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    ; ---------------------------------
    (setq
      _program "analyse"
      _ver     "0-003"
      _auteur  "Lisptic"
      )
     
    ; On transmet un nombre quelconque "d'individus"
    ; Constitués d'une liste de nombres
     
    ; 1 - On détermine le nombre d'individus transmis
    ;  Pour chaque individu :
    ; 2 - on crée l'individu issu du tri de ses nombres
    ; 3 - On le compare à chaque autre individu
    ;     En notant le nombre de nombres qu'il ont en commun
    ; ---------------------------------
     
     
    (defun analyse(&optional _data / _nbIndividu _IndividuS _IndividuS2 _i1 _i2 _nbComm _nombre)
      (if _data
        (progn
     
    ; 1 - Nombre d'individus transmis
          (setq _nbIndividu (length _data))
     
          (if (> _nbIndividu 1)
            (progn
              (setq
                _i1 0 ; compteur 1 à zéro
              );setq
     
              (loop for _Individu in _data do
     
    ; 2 - Création et impression de _IndividuS trié        
                (print (setq _i1(1+ _i1)))(prin1 (setq _IndividuS(stable-sort _Individu #'<)))
     
                (setq _i2 0) ; compteur 2 à zéro                                                    
                (loop for _Individu2 in _data do                             
     
    ; 3 - Comparaison des 2 individus 
                  (setq _IndividuS2(stable-sort _Individu2 #'<))       
                  (setq _nbComm 0) ; compteur de nombres communs à zéro   
     
                  (loop for _nombre in _IndividuS do ; pour chaque nombre de Individu1
                    (if (member _nombre _IndividuS2)(setq _nbComm(1+ _nbComm))) ; on regarde s'il appartient à Individu2    
                  );loop nombre                     
     
                  (print " ")(prin1 (setq _i2(1+ _i2)))(prin1 _IndividuS2)(Prin1 (format nil "   ~S commun(s)" _nbComm)) 
     
                );loop Individu2                          
     
              );loop Individu                  
     
            );progn 
            (progn ;sinon
              (print "Un seul individu ")(prin1 (stable-sort (car _data) #'<))
            );progn 
          );if
     
     
        );progn
        "Analyse attend une liste de nombres : (analyse (list n n n ...))"
      );if
    );defun analyse

    -------

    On lui transmettant une liste de 4 listes de 6 nombres on obtient :

    (analyse (list (list 3 45 6 21 7 5)(list 12 6 42 36 9 15)(list 8 28 27 14 6 9)(list 4 25 7 41 32 6)))

    -->

    1 (3 5 6 7 21 45)
    " " 1(3 5 6 7 21 45)" 6 commun(s)"
    " " 2(6 9 12 15 36 42)" 1 commun(s)"
    " " 3(6 8 9 14 27 28)" 1 commun(s)"
    " " 4(4 6 7 25 32 41)" 2 commun(s)"
    2 (12 15 36 42)
    " " 1(3 5 6 7 21 45)" 0 commun(s)"
    " " 2(12 15 36 42)" 4 commun(s)"
    " " 3(8 9 14 27 28)" 0 commun(s)"
    " " 4(4 6 7 25 32 41)" 0 commun(s)"
    3 (8 9 14 27 28)
    " " 1(3 5 6 7 21 45)" 0 commun(s)"
    " " 2(12 15 36 42)" 0 commun(s)"
    " " 3(8 9 14 27 28)" 5 commun(s)"
    " " 4(4 6 7 25 32 41)" 0 commun(s)"
    4 (4 6 7 25 32 41)
    " " 1(3 5 6 7 21 45)" 2 commun(s)"
    " " 2(12 15 36 42)" 0 commun(s)"
    " " 3(8 9 14 27 28)" 0 commun(s)"
    " " 4(4 6 7 25 32 41)" 6 commun(s)"

    Les résultats sont assez étonnants


    -----------------------------------------

    Le même sans les tris :



    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    ; ---------------------------------
    (setq
      _program "analyse"
      _ver     "0-004"
      _auteur  "Lisptic"
      )
     
    ; On transmet un nombre quelconque "d'individus"
    ; Constitués d'une liste de nombres
     
    ; 1 - On détermine le nombre d'individus transmis
    ;  Pour chaque individu :
    ; 2 - on imprime l'individu
    ; 3 - On le compare à chaque autre individu
    ;     En notant le nombre de nombres qu'il ont en commun
    ; ---------------------------------
     
     
    (defun analyse(&optional _data / _nbIndividu _Individu2 _i1 _i2 _nbComm _nombre)
      (if _data
        (progn
     
    ; 1 - Nombre d'individus transmis
          (setq _nbIndividu (length _data))
     
          (if (> _nbIndividu 1)
            (progn
              (setq
                _i1 0 ; compteur 1 à zéro
                _data2 (copy-list _data) ; copie distincte de la liste transmise
              );setq
     
              (loop for _Individu in _data do
     
    ; 2 - impression de chaque individu      
                (print (setq _i1(1+ _i1)))(prin1 _Individu)                          
     
    ; 3 - Comparaison à chaque individu + impression du résultat 
                (setq _i2 0) ; compteur 2 à zéro                                                    
                (loop for _Individu2 in _data do  
                  (setq _nbComm 0) ; compteur de nombres communs à zéro   
     
                  (loop for _nombre in _Individu do ; pour chaque nombre de Individu1
                    (if (member _nombre _Individu2)(setq _nbComm(1+ _nbComm))) ; on regarde s'il appartient à Individu2    
                  );loop nombre                     
     
                  (print " ")(prin1 (setq _i2(1+ _i2)))(prin1 _Individu2)(Prin1 (format nil "   ~S commun(s)" _nbComm)) 
     
                );loop Individu2                          
     
              );loop Individu                  
     
            );progn 
            (progn ;sinon
              (print "Un seul individu ")(prin1 (stable-sort (car _data) #'<))
            );progn 
          );if
     
     
        );progn
        "Analyse attend une liste de listes de nombres : (analyse (list (list n n n)(list n n n)(...)...))"
      );if
    );defun analyse
    -----------------------------------------

    Et son utilisation :


    (analyse (list (list 3 45 6 21 7 5)(list 12 6 42 36 9 15)(list 8 28 27 14 6 9)(list 4 25 7 41 32 6)))
    -->
    1 (3 45 6 21 7 5)
    " " 1(3 45 6 21 7 5)" 6 commun(s)"
    " " 2(12 6 42 36 9 15)" 1 commun(s)"
    " " 3(8 28 27 14 6 9)" 1 commun(s)"
    " " 4(4 25 7 41 32 6)" 2 commun(s)"
    2 (12 6 42 36 9 15)
    " " 1(3 45 6 21 7 5)" 1 commun(s)"
    " " 2(12 6 42 36 9 15)" 6 commun(s)"
    " " 3(8 28 27 14 6 9)" 2 commun(s)"
    " " 4(4 25 7 41 32 6)" 1 commun(s)"
    3 (8 28 27 14 6 9)
    " " 1(3 45 6 21 7 5)" 1 commun(s)"
    " " 2(12 6 42 36 9 15)" 2 commun(s)"
    " " 3(8 28 27 14 6 9)" 6 commun(s)"
    " " 4(4 25 7 41 32 6)" 1 commun(s)"
    4 (4 25 7 41 32 6)
    " " 1(3 45 6 21 7 5)" 2 commun(s)"
    " " 2(12 6 42 36 9 15)" 1 commun(s)"
    " " 3(8 28 27 14 6 9)" 1 commun(s)"
    " " 4(4 25 7 41 32 6)" 6 commun(s)"

    avec des résultats corrects !

    -----------------------------------------

    J'espère que ce comportement est normal et que c'est moi qui me plante quelque part !
    Merci d'avance pour vos avis (et conseils pour la suite)

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Zéro réponse ?

    J'hésite entre bravo et merci !

Discussions similaires

  1. Bug dans le framework sur la fonction LoadControl
    Par lutecefalco dans le forum ASP.NET
    Réponses: 6
    Dernier message: 24/09/2009, 23h59
  2. [POO] Bug sur une fonction récursive : renvoit undefined
    Par zaboug dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/06/2008, 15h10
  3. Bug sur les fonctions virtuelles
    Par Anthony.Desvernois dans le forum C++
    Réponses: 4
    Dernier message: 28/01/2008, 18h30
  4. Rapport de bug sur les fonctions de XDebug
    Par lryo79 dans le forum Zend Studio
    Réponses: 8
    Dernier message: 14/06/2007, 16h35

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