afficher >><< masquer ]
SAMPI - Editeur structuré
1. Le Problème et la Proposition
2. Le Langage Primitif de Représentation Textuelle
2.1. Présentation de la Syntaxe Concrète
2.2. Notations
2.3. Exemple de structuration des données
2.4. Exemple de structuration des traitements
2.5. Exemple de structurations connexes
2.5.1. Présentation
2.5.2. La macro-génération
2.5.3. Les symétries du programme
2.5.33.1. Les données
2.5.33.2. Les traitements
2.5.4. Annexe 1 : Construction du champ CHP_PRESENT
2.5.5. Annexe 2 : Les fonctions de traitement en Lisp
3. Le Langage Complété pour la Structuration des Textes
3.1. Présentation de la Syntaxe Complétée
3.2. Etude quantitative de l'évolution des programmes
3.3. L'édition syntaxique
3.4. étude de cas : le langage LTR3 et l'atelier ENTREPRISE
4. L'Enrichissement du Langage par de Nouveaux Concepts
4.1. Présentation de la Syntaxe Abstraite
4.2. Les difficultés
4.3. Compléter la Syntaxe
5. La Formalisation des Solutions Techniques
5.1. L'évaluation fonctionnelle
5.2. La structuration par les objets
5.3. Modèle sémantique comparé de l'évaluateur
5.4. Comparaison critique
5.5. Construction de la Syntaxe Abstraite
6. Les Comparaisons avec d'autres Approches
7. Les Perspectives
8. Les Editeurs
8.0. brisé sur la barrière de la complexité (une fois de plus)
8.1. L'éditeur ligne : Manuel de l'utilisateur
8.2. L'éditeur page : Guide de l'utilisateur
9. Les Aspects d'Implantation
9.1. Contexte d'évaluation
9.2. La Syntaxe Abstraite : Manuel du concepteur
9.3. L'éditeur page : Guide de l'implanteur
Références
Rubrique Perl-Javascript

Les symétries du programme

Comme il a déjà été dit, la relative proximité du modèle mathématique (les matrices) fait apparaître des symétries dans le programme.

On donne en annexe les fonctions de traitement (*put et *rem) et les fonctions auxiliaires (ascendance, *ins et *sup).

1. Les données

2. Les traitements

2. Les traitements

Les traitements *put et *rem sont inverses l'un de l'autre, par définition. On va donc encore assez logiquement observer une symétrie entre ces traitements – sur un même type de données PHYL ou OPER.

On donne ici aussi les deux fonctions où la similitude est la plus visible :

(de *putoper (nomoper attoper)
   (let ((oper (makeoper nomoper attoper)))
        (ins opert oper)
        (mapv '(lambda (phyl)
                  (let ((drap (makedrap)))
                       (ins (operphyl phyl) drap)
                       (ins (phyloper oper) drap)))
              phylt))
   (*putoper-ana nomoper attoper))

(de *remoper (oper)
   (let ((numoper (num opert oper)))
        (numsup opert numoper)
        (mapv '(lambda (phyl)
                  (numsup (operphyl phyl) numoper))
              phylt))
   (*remoper-ana oper))

Une écriture « plus orthodoxe » de *remoper serait :

(de *remoper (oper)
   (sup opert oper)
   (mapv '(lambda (phyl)
             (sup (operphyl phyl) oper))
         phylt))
   (*remoper-ana oper))

qui rend le parallèle plus facile entre les deux fonctions – on remplace, subtilement, ins par sup ou réciproquement.

Les fonctions num... qui ont été introduites permettent d'améliorer l'efficacité de l'algorithme : au lieu de rechercher un élément de la liste d'après son nom, on retient son numéro d'ordre dans la liste (numoper), puis on accède directement à l'élément par ce numéro.

Pour garantir le passage de *remphyl à *remoper, il faut donc :

On peut noter que dans ces manipulations « textuelles » du programme on est très loin du langage et de la sémantique des termes qu'il définit, et pourtant on est très près du sens intuitif qu'on donne au texte du programme.