7.1. Étude de cas I : architecture réactive native
Cette étude s'inscrit dans la lignée de la programmation réactive fonctionnelle et des architectures à flux unidirectionnel — la famille dont Elm et React ont fait une pratique courante —, où l'état d'une interface se déduit d'un flux d'événements plutôt que de se muter directement. K7PL en reprend le principe sans en emprunter l'implémentation : le diffing y devient un catamorphisme, et la mutation du DOM une capabilité exclusive plutôt qu'une convention de cadriciel.
Une interface utilisateur est un cas de charge particulièrement sévère pour K7PL : elle doit redessiner son état à un rythme fixe, sans qu'une pause de ramasse-miettes ne vienne jamais rompre ce rythme, tout en laissant le développeur raisonner sur son état comme sur une simple valeur plutôt que sur une séquence de mutations. K7PL n'y répond par aucun cadriciel séparé du langage : le cycle réactif traverse les trois couches à chaque image, et chaque étape de ce cycle n'est qu'une instance d'un mécanisme déjà construit.
Le cycle réactif unidirectionnel à travers les trois couches
Le trajet d'un événement à travers les trois couches, et le point où il referme le cycle sur lui-même.
Un événement, capturé en couche 1, alimente un flux réactif de couche 2 — la même semicoroutine
asymétrique que le chapitre 4 (§4.2) a construite pour tout flux infini,
ici spécialisée aux événements d'interface. Ce flux produit un nouvel état, purement représenté
comme une X-expression (chapitre 5, §5.2) plutôt que comme une
structure mutable : la couche 2 ne manipule jamais le DOM directement, elle ne fait que décrire
l'arbre qu'il devrait devenir. La réconciliation de cet arbre avec le précédent est un catamorphisme
de couche 3 (chapitre 2, §2.3). Un pli dont la mesure —
la profondeur de l'arbre — décroît strictement à chaque étape, produisant un vecteur de correctifs
sur une arène linéaire plutôt qu'une nouvelle structure entière. Lorsque deux branches de l'arbre
partagent le même hachage BLAKE3 — la même déduplication canonique que le chapitre 4
(§4.3) a établie pour l'état des acteurs —, le diffing s'arrête sur
cette branche en O(1) sans la comparer nœud par nœud. Le vecteur de correctifs qui en résulte
redescend enfin en couche 1, où il est appliqué au DOM réel.
Cette dernière étape révèle que l'isolation entre couches n'est pas qu'une discipline de style. La
couche 1 détient seule la WriteCap(DOM), capabilité graduée au sens du chapitre 3
(§3.1), et aucune expression de couche 2 ne peut y prétendre. La
couche 2 ne contient jamais que des X-expressions, des données pures, jamais un pointeur vers le
DOM. Une fuite de pointeur DOM vers la couche 2 est ainsi rendue non typable, pas seulement
déconseillée. Les animations prolongent ce même cycle sans y ajouter de mécanisme : ce sont des
transformations pures de couche 3, pilotées par un flux temporel coinductif de couche 2 dont la
productivité (chapitre 2, §2.3) garantit qu'une nouvelle
image est toujours disponible en temps fini. Les arènes de couche 1 qui portent ce cycle sont
réutilisées par rotation plutôt que libérées et réallouées : aucun ramasse-miettes ne vient
interrompre le rythme d'affichage. C'est la promesse que P3 faisait depuis le chapitre 1, tenue ici
sous une contrainte que la théorie seule ne pouvait pas mettre à l'épreuve.