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