K7PL

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) :

Listing 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).

Listing 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).

Listing 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) :

Listing 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.

Références
  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. VIVIEN, S.; RÉMY, D.; SCHERER, G. On the Design and Implementation of Modular Explicits. In: Jfla 2026. Oberbronn, 2026.