L'exemple qu'on traite est le programme Lisp qui implante les fonctions de modification incrémentale de la syntaxe abstraite (cf. Chapitre 5.5, « Construction de la Syntaxe Abstraite »). Deux remarques s'imposent :
Je ne pense pas qu'il faille en conclure que l'exemple est mal choisi : on n'a pas toujours de répétition dans le texte source d'un programme ; mais quand on en a, et c'est le cas spécialement dans les parties algorithmiques, il me semble intéressant de les mettre en relief. C'est la situation dans laquelle on se place.
Pour terminer ce préambule, je voudrais juste signaler que le programme n'a pas été remanié pour étayer l'argumentation. S'il présente de nombreuses symétries c'est parce qu'elles se sont imposées d'une façon naturelle à la rédaction du programme.
2. Les données
On morcelle les traitements pour en faciliter la réalisation :

graphe d'appel
les « fonctions utilisateur » | ||
put | = | putphyl, putoper, putoperphyl, putperephyl, putfilsphyl |
rem | = | remphyl, remoper, remoperphyl, remperephyl, remfilsphyl |
get | = | getphyl, getoper, getoperphyl, getperephyl, getfilsphyl |
| Elles font le lien entre l'utilisateur qui nomme les objets (phylum ou opérateur) et les objets eux-mêmes (contrôles de définition ; contrôles de non redéfinition). | ||
les fonctions de traitement | ||
*put | = | *putphyl, *putoper, *putoperphyl, *putperephyl |
*rem | = | *remphyl, *remoper, *remoperphyl, *remperephyl |
| Elles réalisent les traitements sur les objets (phylum ou opérateur). | ||
les fonctions d'erreur | ||
ERR | = | CONTROLE-def, CONTROLE-indef, ERREUR |
| Elles filtrent les cas d'erreur. | ||
les fonctions auxiliaires | ||
ascendance | ||
*ins | = | *insereoperphyl |
*sup | = | *supprimeoperphyl |
| Elles correspondent à un « regroupement de code » – le traitement étant effectué à plusieurs points distincts du programme, on définit une fonction. | ||
le module générique | ||
liste | = | recherche, ins, sup |
| Elles définissent la structure générique des listes : | ||
recherche | : | recherche d'un élément de la liste d'après son nom |
ins | : | insertion d'un élément dans la liste |
sup | : | suppression d'un élément de la liste |
Le module est paramétré par la fonction nom (le nom d'un élément de la liste). | ||