Nous commençons par une calculatrice qui lit de gauche à droite. Un exemple qui lui résiste nous amène à conserver le calcul dans un arbre. Nous ajoutons ensuite des noms, des fonctions, leur environnement de définition et un choix conditionnel. Chaque étape commence par un programme du langage à construire.

La présentation s’arrête pour un atelier, puis nous comparons nos essais. Juste avant chaque consigne, une slide rappelle les formes Elixir que le notebook utilise ; chaque atelier affiche ses slides et ses repères, et les formes nouvelles (with, une valeur par défaut, Enum.zip, ++…) sont expliquées dans le notebook à l’endroit où vous les rencontrez. Ouvrez les notebooks dans l’ordre et reprenez votre propre code aux endroits indiqués. Les consignes donnent des contrats et des cas à vérifier ; un exemple montre la forme, les fonctions analogues sont à écrire. Gardez une prédiction et un contre-exemple, y compris lorsqu’une implémentation n’est pas terminée.

Les étapes sont ordonnées pour avancer progressivement. Nous pourrons nous arrêter sur les arbres, tracer un appel, puis poursuivre les fonctions et les fermetures selon notre rythme. Je préciserai en cours les notebooks à terminer et le résultat attendu ; les prolongements non demandés restent facultatifs. Gardez vos étapes dans AP2/, pour le rendu commun AP1–AP3 au 6 décembre 2026 à 23 h 59 ; cf. Rendre un devoir. Si un bout de syntaxe Elixir vous manque en route, les chapitres 1 à 4 du poly se consultent au besoin ; ils ne sont pas un prérequis.

Ouvrir les ateliers

1. Une calculatrice, puis ses limites

Calculez au fil de la lecture, puis confrontez votre règle aux priorités et aux parenthèses. Gardez un contre-exemple à discuter.

Slides 7 à 13Elixir : defp, gardes when, with · poly, chap. 4 et chap. 5, § 5.1 et 5.2.1.

Run in LivebookTélécharger le .livemd

2. Conserver le calcul dans un arbre

Reprenez votre code, construisez un AST et séparez lecture et évaluation. Faites apparaître les priorités dans la forme de l’arbre.

Slides 14 à 26Elixir : tuples imbriqués, case, une clause par nœud · poly, chap. 2, 4 et chap. 5, § 5.2 à 5.5.

Run in LivebookTélécharger le .livemd

3. Des noms et des fonctions

Ajoutez un environnement, des paramètres et un appel. Que manque-t-il à une fonction dont le corps utilise un nom extérieur ?

Slides 28 à 36Elixir : liste de couples, récursion sur le reste, Enum.zip/2 · poly, chap. 3, 4 et chap. 5, § 5.6 et 5.7.1.

Run in LivebookTélécharger le .livemd

4. Une fonction garde son contexte

Distinguez l’environnement de définition de celui de l’appel. Construisez une fermeture, puis une fonction qui fabrique une autre fonction.

Slides 37 à 45Aucune forme Elixir nouvelle : seule la valeur produite change · poly, chap. 5, § 5.7 « Fonctions et fermetures ».

Run in LivebookTélécharger le .livemd

5. Choisir ce qui sera exécuté

Ajoutez les booléens et case. Une branche contient une division par zéro : dans quelles conditions le programme réussit-il ?

Slides 46 à 53Elixir : case, assert_in_delta · poly, chap. 2 et chap. 5, § 5.8 « Décider : booléens et case ».

Run in LivebookTélécharger le .livemd