5.5. Mise en pratique
Écrire du K7PL, c'est choisir, à chaque expression, le fragment le moins permissif que la tâche
autorise, et laisser les délimiteurs en porter la trace. Avant de composer les trois couches sur un
exemple complet, un mot sur ce que la notation tacite du §5.2
donne à voir une fois débarrassée de ses noms. La moyenne d'un tableau s'écrit +´÷≠ : plier par
addition, diviser par la longueur. Son écart-type s'écrit √(+´(⊢-+´÷≠)²÷≠) : la même moyenne
soustraite à chaque élément, élevée au carré, repliée et divisée à son tour, puis passée à la
racine. Aucun argument n'y est nommé ; le train se lit comme une composition de fonctions plutôt que
comme une suite d'instructions, ce que le §5.2 annonçait.
Cette section construit maintenant un exemple unique — un compteur borné, répliqué en acteur — en remontant des trois couches jusqu'à leur composition, puis en examinant l'erreur la plus commune à leur frontière.
Le cœur du calcul est une fonction pure de couche 3 (3) :
Le cœur du calcul : une fonction pure de couche 3, totale et sans effet
[defn incrémente-borné? (valeur borne)
(select (< valeur borne)
(Ok (+ valeur 1))
(Err Débordement))]
Le suffixe ? engage le contrat du chapitre 3 (§3.3) :
cette fonction ne peut ni déclencher d'effet ni paniquer, elle ne peut que retourner une valeur —
ici un Result, puisque le débordement reste une issue normale du calcul plutôt qu'une exception à
lever.
Autour de ce calcul, une couche 2 orchestre l'effet observable : recevoir un message, appeler la fonction pure, décrire le nouvel état sans jamais le muter directement (4).
La couche 2 orchestre l'effet observable sans jamais muter l'état directement
(defhandler gestionnaire-compteur (message état)
(match message
((Incrémente n)
(match [incrémente-borné? (^. état valeur) (^. état borne)]
((Ok nouvelle-valeur)
(HandlerResult :état (^= état valeur nouvelle-valeur) :réponse (Ok nouvelle-valeur)))
((Err e)
(HandlerResult :état état :réponse (Err e)))))))
Le calcul de couche 3 est appelé depuis la couche 2, ce qui est légitime : le pur s'invoque de
partout (§5.1). C'est cette frontière, seule, que les
crochets de l'appel signalent. Le reste du gestionnaire, qui ne quitte jamais la couche 2, s'écrit
en parenthèses ordinaires — y compris la mise à jour de l'état par la lentille ^=, qui préserve le
champ borne inchangé sans qu'aucun HandlerResult n'ait besoin de le répéter.
L'acteur lui-même n'est qu'une déclaration : aucune logique n'y figure directement, seulement la topologie et le rattachement du gestionnaire (5).
L'acteur ne porte que sa topologie et le rattachement de son gestionnaire
{defactor Compteur
(champ valeur : Int)
(champ borne : Int)
(bind-to gestionnaire-compteur)}
La forme bind-to appelle une remarque, car elle est la seule construction du langage dont
l'existence ne se déduise pas du jugement germinal. Elle déclare une association que rien n'oblige à
déclarer, contrevenant à la fois à la clôture du chapitre 1 et au principe de ce chapitre. Elle
n'est donc pas une primitive. Un acteur est la paire additive dépendante
(\text{état} : S)\,\&\,\text{Handler}(S) du chapitre 3
(§3.3), et bind-to n'est qu'un accès de champ. Lorsque
le programmeur l'omet, l'élaborateur remplit la seconde composante par recherche dirigée par le type
— technique dont la propriété conditionnante est la cohérence, le fait qu'un programme valide ait
exactement une signification [29], et dont la preuve formelle
en présence de non-déterminisme est récente et non triviale [30], [31].
Ici elle ne coûte rien : la structure fixe le sens, la recherche n'est qu'un sucre, et une recherche
ambiguë est refusée en Phase 0 plutôt que résolue arbitrairement. La cohérence est une condition
d'erreur, non une obligation de métathéorie. L'unicité du type d'état par gabarit (chapitre 4,
§4.5) est la condition sous laquelle le sucre aboutit ; la voie
modulaire, où l'association est portée par une structure plutôt que déduite, est activement conçue
ailleurs [32].
Ici, champ et bind-to restent tous deux dans le fragment ambiant de la déclaration : ils
s'écrivent en parenthèses ordinaires, et seule l'accolade d'ouverture de defactor annonce la
couche 1. Ces trois déclarations respectent déjà la forme descendante
{ ... ( ... [ ... ] ... ) ... } du §5.1 : bind-to relie
l'acteur à son gestionnaire, qui appelle lui-même le calcul pur — chaque frontière franchie porte le
délimiteur du fragment vers lequel elle mène, et pas une de plus.
L'erreur la plus commune consiste à faire remonter, dans l'autre sens, une construction qui suppose
un effet à l'intérieur d'un bloc [ ] (6) :
L'erreur la plus commune : une construction à effet remontée dans un bloc pur, rejetée par ERR-TOP-001
[defn incrémente-borné? (valeur borne) (HandlerResult :état valeur :réponse (Ok valeur))] ; rejeté : ERR-TOP-001
La parenthèse ordinaire n'est pas ici en cause en elle-même — un appel à select ou à ^.
s'écrirait de la même manière dans ce même bloc, sans rien enfreindre. Ce qui est rejeté, c'est que
HandlerResult suppose un état d'acteur et un effet de couche 2 — \mathcal{E} et
\Delta_{\text{aff}} — dont le jugement de couche 3 ne dispose tout simplement pas (\Delta = \Delta_{\omega}, chapitre 1, §1.4). Aucun délimiteur ne
pourrait rendre cet appel légitime, puisqu'aucune transition vers la couche 2 n'est permise depuis
la couche 3. Ce n'est pas une erreur de notation que le bon crochet aurait évitée, c'est une
impossibilité structurelle que la notation ne fait que rendre visible.
- HERLIHY, Anna; SHAIKHHA, Amir; AILAMAKI, Anastasia; ODERSKY, Martin. Modular Substructural Constraints for Embedded DSLs. In: Proceedings of the 25th ACM SIGPLAN International Conference on Generative Programming: Concepts and Experiences [en ligne]. Brussels Belgium: ACM, 2026, p. 60–71 [visité le 2026-08-02]. Disp. à l’adr. DOI: 10.1145/3814885.3816411
- DE MUIJNCK-HUGHES, Jan; VANDERBAUWHEDE, Wim. Wiring Circuits Is Easy as \0,1,ω\, or Is It. LIPIcs, Volume 263, ECOOP 2023 [en ligne]. Schloss Dagstuhl – Leibniz-Zentrum für Informatik, 2023, vol. 263, p. 8:1-8:28 [visité le 2026-08-02]. Disp. à l’adr. DOI: 10.4230/LIPICS.ECOOP.2023.8
- HICKEY, Rich. A History of Clojure. Proceedings of the ACM on Programming Languages [en ligne]. 2020, vol. 4, p. 1–46 [visité le 2026-08-27]. Disp. à l’adr. DOI: 10.1145/3386321
- STEFIK, Andreas; SIEBERT, Susanna. An Empirical Investigation into Programming Language Syntax. ACM Transactions on Computing Education [en ligne]. 2013, vol. 13, no. 4, p. 1–40 [visité le 2026-08-26]. Disp. à l’adr. DOI: 10.1145/2534973
- COBLENZ, Michael; ALDRICH, Jonathan; MYERS, Brad A.; SUNSHINE, Joshua. Can Advanced Type Systems Be Usable? An Empirical Study of Ownership, Assets, and Typestate in Obsidian. Proceedings of the ACM on Programming Languages [en ligne]. 2020, vol. 4, p. 1–28 [visité le 2025-05-06]. Disp. à l’adr. DOI: 10.1145/3428200
- OLIVEIRA, Francisco; MENDES, Alexandra; CARREIRA, Carolina. What Challenges Do Developers Face When Using Verification-Aware Programming Languages? In: 2025 IEEE 36th International Symposium on Software Reliability Engineering (ISSRE) [en ligne]. São Paulo, Brazil: IEEE, 2025, p. 203–214 [visité le 2026-08-27]. Disp. à l’adr. DOI: 10.1109/ISSRE66568.2025.00031
- OLIVEIRA, Delano; BRUNO, Reydne; MADEIRAL, Fernanda; CASTOR, Fernando. Evaluating Code Readability and Legibility: An Examination of Human-Centric Studies. In: 2020 IEEE International Conference on Software Maintenance and Evolution (ICSME) [en ligne]. Adelaide, Australia: IEEE, 2020, p. 348–359 [visité le 2026-09-03]. Disp. à l’adr. DOI: 10.1109/ICSME46990.2020.00041
- LOPES, Cristina V.; MAJ, Petr; MARTINS, Pedro; SAINI, Vaibhav; YANG, Di; ZITNY, Jakub; SAJNANI, Hitesh; VITEK, Jan. DéjàVu: A Map of Code Duplicates on GitHub. Proceedings of the ACM on Programming Languages [en ligne]. 2017, vol. 1, p. 1–28 [visité le 2025-05-06]. Disp. à l’adr. DOI: 10.1145/3133908
- COBLENZ, Michael; ALDRICH, Jonathan; MYERS, Brad A.; SUNSHINE, Joshua. Interdisciplinary Programming Language Design. In: Proceedings of the 2018 ACM SIGPLAN International Symposium on New Ideas, New Paradigms, and Reflections on Programming and Software [en ligne]. Boston MA USA: ACM, 2018, p. 133–146 [visité le 2026-08-27]. Disp. à l’adr. DOI: 10.1145/3276954.3276965
- IVERSON, Kenneth E. Notation as a Tool of Thought. Communications of the ACM [en ligne]. 1980, vol. 23, no. 8, p. 444–465 [visité le 2026-08-26]. Disp. à l’adr. DOI: 10.1145/358896.358899
- JIA, Xiaodong; KUMAR, Ashish; TAN, Gang. A Derivative-Based Parser Generator for Visibly Pushdown Grammars. Proceedings of the ACM on Programming Languages [en ligne]. 2021, vol. 5, p. 1–24 [visité le 2025-05-07]. Disp. à l’adr. DOI: 10.1145/3485528
- APPEL, Andrew W. A Critique of Standard ML. Journal of Functional Programming [en ligne]. 1993, vol. 3, no. 4, p. 391–429 [visité le 2025-05-15]. Disp. à l’adr. DOI: 10.1017/S0956796800000836
- BOUR, Frédéric; REFIS, Thomas; SCHERER, Gabriel. Merlin: A Language Server for OCaml (Experience Report). Proceedings of the ACM on Programming Languages [en ligne]. 2018, vol. 2, p. 1–15. Disp. à l’adr. DOI: 10.1145/3236798
- COHEN, Sam; CHUGH, Ravi. Code Style Sheets: CSS for Code. Proceedings of the ACM on Programming Languages [en ligne]. 2025, vol. 9, p. 196–224 [visité le 2025-05-19]. Disp. à l’adr. DOI: 10.1145/3720421
- FALKOFF, Adin D.; IVERSON, Kenneth E. The Evolution of APL. ACM SIGPLAN Notices [en ligne]. 1978, vol. 13, no. 8, p. 47–57 [visité le 2026-08-26]. Disp. à l’adr. DOI: 10.1145/960118.808372
- HUI, Roger K. W.; KROMBERG, Morten J. APL since 1978. Proceedings of the ACM on Programming Languages [en ligne]. 2020, vol. 4, p. 1–108 [visité le 2025-04-17]. Disp. à l’adr. DOI: 10.1145/3386319
- STROUSTRUP, Bjarne. Thriving in a Crowded and Changing World: C++ 2006–2020. Proceedings of the ACM on Programming Languages [en ligne]. 2020, vol. 4, p. 1–168 [visité le 2025-05-05]. Disp. à l’adr. DOI: 10.1145/3386320
- MATUTE, Gabriel; NI, Wode; BARIK, Titus; CHEUNG, Alvin; CHASINS, Sarah E. Syntactic Code Search with Sequence-to-Tree Matching: Supporting Syntactic Search with Incomplete Code Fragments. Proceedings of the ACM on Programming Languages [en ligne]. 2024, vol. 8, p. 2051–2072 [visité le 2025-05-08]. Disp. à l’adr. DOI: 10.1145/3656460
- BACH POULSEN, Casper; VAN DER REST, Cas. Hefty Algebras: Modular Elaboration of Higher-Order Algebraic Effects. Proceedings of the ACM on Programming Languages [en ligne]. 2023, vol. 7, no. POPL, p. 1801–1831 [visité le 2025-05-07]. Disp. à l’adr. DOI: 10.1145/3571255
- ALLAIS, Guillaume; ATKEY, Robert; CHAPMAN, James; MCBRIDE, Conor; MCKINNA, James. A Type and Scope Safe Universe of Syntaxes with Binding: Their Semantics and Proofs. Proceedings of the ACM on Programming Languages [en ligne]. 2018, vol. 2, no. ICFP, p. 1–30 [visité le 2025-06-05]. Disp. à l’adr. DOI: 10.1145/3236785
- FIORE, Marcelo; SZAMOZVANCEV, Dmitrij. Formal Metatheory of Second-Order Abstract Syntax. Proceedings of the ACM on Programming Languages [en ligne]. 2022, vol. 6, no. POPL, p. 1–29 [visité le 2026-08-02]. Disp. à l’adr. DOI: 10.1145/3498715
- SAAL, Harry J. Considerations in the Design of a Compiler for APL. ACM SIGAPL APL Quote Quad [en ligne]. 1978, vol. 8, no. 4, p. 8–14 [visité le 2025-04-18]. Disp. à l’adr. DOI: 10.1145/586032.586034
- KOVÁCS, András. Closure-Free Functional Programming in a Two-Level Type Theory. Proceedings of the ACM on Programming Languages [en ligne]. 2024, vol. 8, p. 659–692 [visité le 2025-05-08]. Disp. à l’adr. DOI: 10.1145/3674648
- CLINGER, William D; WAND, Mitchell. Hygienic Macro Technology. Proceedings of the ACM on Programming Languages [en ligne]. 2020, vol. 4, p. 1–110. Disp. à l’adr. DOI: 10.1145/3386330
- SYME, Don. The Early History of F#. Proceedings of the ACM on Programming Languages [en ligne]. 2020, vol. 4, p. 1–58 [visité le 2025-05-05]. Disp. à l’adr. DOI: 10.1145/3386325
- POMBRIO, Justin; KRISHNAMURTHI, Shriram. Hygienic Resugaring of Compositional Desugaring. In: Proceedings of the 20th ACM SIGPLAN International Conference on Functional Programming [en ligne]. Vancouver BC Canada: ACM, 2015, p. 75–87. Disp. à l’adr. DOI: 10.1145/2784731.2784755
- PITTS, Andrew M. Nominal Sets: Names and Symmetry in Computer Science [en ligne]. 1e éd. Cambridge: Cambridge University Press, 2013, no. 57 [visité le 2026-08-19]. Disp. à l’adr. DOI: 10.1017/CBO9781139084673
- HOEKSTRA, Conor. A Combinator, n-Dimensional Array Library in Smalltalk [en ligne]. Toronto, Ontario, Canada: Ryerson University, 2024. Disp. à l’adr. DOI: 10.32920/25412854.v1
- RACORDON, Dimi; FLESSELLE, Eugene; PHAM, Cao Nguyen. On the State of Coherence in the Land of Type Classes. The Art, Science, and Engineering of Programming [en ligne]. EPFL, 2025, vol. 10, no. 1, p. 15 [visité le 2026-08-02]. Disp. à l’adr. DOI: 10.22152/programming-journal.org/2025/10/15
- BOTTU, G.-J.; XIE, N.; MARNTIROSIAN, K.; SCHRIJVERS, T. Coherence of Type Class Resolution [en ligne]. et Univ. of Hong Kong, s. d.. Disp. à l’adr. DOI: 10.1145/3341695
- SCHRIJVERS, Tom; OLIVEIRA, Bruno C.D.S.; WADLER, Philip; MARNTIROSIAN, Koar. COCHIS: Stable and Coherent Implicits. Journal of Functional Programming [en ligne]. 2019, vol. 29, p. e3 [visité le 2025-05-19]. Disp. à l’adr. DOI: 10.1017/S0956796818000242
- VIVIEN, S.; RÉMY, D.; SCHERER, G. On the Design and Implementation of Modular Explicits. In: Jfla 2026. Oberbronn, 2026.