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
La structure des données est une matrice de drapeaux, dont les lignes sont les phyla et les colonnes les opérateurs :

les variables globales
Elles permettent de parcourir une ligne ou une colonne de la matrice :
phylt | : parcours de la liste des phyla |
opert | : parcours de la liste des opérateurs |
le phylum PHYL

champs du phylum | ||
nomphyl | : | nom du phylum |
attphyl | : | attributs du phylum |
operphyl | : | la ligne attachée au phylum de la matrice |
perephyl | : | liste des phyla pères du phylum |
parent | : | champ entier : « degré de connexité » du nœud "phylum" par rapport à un autre phylum donné |
construction du phylum | ||
makephyl (nomphyl attphyl) | ||
| : | construit le phylum ( nomphyl attphyl () () 0 ) | |
propriétés du phylum | ||
nomphyl | : | nom du phylum |
attphyl | : | attributs du phylum |
operphyl | : | liste des drapeaux, le long de la liste des opérateurs |
perephyl | : | liste des phyla pères du phylum |
parent | : | test (vrai si le champ parent est non nul) |
valparent | : | valeur du champ parent |
setparent | : | incrémente de 1 le champ parent |
resetparent | : | décrémente de 1 le champ parent |
Les quatre premiers champs sont aussi des propriétés du type. Le cinquième est en revanche plus complexe.
l'opérateur OPER

champs de l'opérateur | ||
nomoper | : | nom de l'opérateur |
attoper | : | attributs de l'opérateur |
phyloper | : | la colonne attachée à l'opérateur de la matrice |
construction de l'opérateur | ||
makeoper (nomoper attoper) | ||
| : | construit l'opérateur ( nomoper attoper () ) | |
propriétés de l'opérateur | ||
nomoper | : | nom de l'opérateur |
attoper | : | attributs de l'opérateur |
phyloper | : | liste des drapeaux, le long de la liste des phyla |
Les champs sont ici identifiés aux propriétés.
le drapeau DRAP

champs du drapeau | ||
present | : | champ booléen : « appartenance en propre » d'un opérateur à un phylum |
visib | : | champ entier : « degré d'appartenance » d'un opérateur à un phylum |
chgtvisib | : | champ booléen : on y conserve l'information « l'opérateur est nouvellement visible » ou « l'opérateur était anciennement visible » en vue de l'analyse des attributs |
| (ce dernier champ est introduit du fait de la séparation des traitements qui modifient la structure de la matrice de ceux qui réalisent l'analyse des attributs) | ||
construction du drapeau | ||
makedrap | : | construit le drapeau ( () 0 () ) |
propriétés du drapeau | ||
present | : | test (vrai si le champ present est vrai) |
setpresent | : | met le champ present à vrai |
resetpresent | : | met le champ present à faux |
visib | : | test (vrai si le champ visib est non nul) |
valvisib | : | valeur du champ visib |
nouvvisib | : | test (vrai si le champ chgtvisib est vrai) |
ancivisib | : | idem |
incrvisib | : | incrémente le champ chgtvisib d'un entier en paramètre+ met à jour le champ chgtvisib si « l'opérateur est nouvellement visible », c'est-à-dire si le champ visib était nul avant l'appel de la fonction |
decrvisib | : | décrémente le champ chgtvisib d'un entier en paramètre+ idem inversé |
resetnouvvisib | : | met le champ chgtvisib à faux |
resetancivisib | : | idem |
L'accès aux champs est ici "filtré" par diverses fonctions. En particulier le champ chgtvisib est regardé relativement au traitement antérieur :
nouvvisib) après avoir incrémenté le drapeau (incrvisib) ;ancivisib) après avoir décrémenté le drapeau (decrvisib).