U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 1 XU - ensiie - Prog. fonctionnelle 2011/2012 x λx.M β − → induction/récurrence capture tout programme (M1 M2 ) U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 3 � Preuve de correction aisée et naturelle Bonus modèle formel : λ-calcul Programmation similaire à raisonnement mathématique (modulo scories) (pourquoi �= comment) � Abstraction, programmation de haut niveau (JAMAIS de modification) (expressions, fonctions de première classe) • Persistance � Simplification du code et donc correction � Efficacité (undo gratuit) • Tout est valeur Aspects principaux ici : Programmation fonctionnelle XU - ensiie - Prog. fonctionnelle 2011/2012 2011/2012 Xavier Urbain Programmation fonctionnelle XU - ensiie - Prog. fonctionnelle 2011/2012 100% pur jus ? Pénible ? Utilisé ? Efficace ? U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 4 Troll bashing U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 2 Programmation fonctionnelle XU - ensiie - Prog. fonctionnelle 2011/2012 Travaux dirigés : aspects théoriques, intérêt Machines : manipulation, mise en œuvre • Outils (itérateurs, constructions, etc.) • Structure de donnée Chaque partie : Débroussaillage (1 ou 2 cours) Futé : Problème � bonne structure � langage adapté Troll : impératif ! fonctionnel ! Programmation. . . arguments toujours évalués en premier les types sont nos amis ! ici : noyau fonctionnel et exceptions • Le langage Caml • Purely Functional Data Structures SML ! U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 7 • Cambridge University Press XU - ensiie - Prog. fonctionnelle 2011/2012 • Dunod U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 8 • Leroy, Weis Camllight ! • http://www.pps.jussieu.fr/Livres/ ora/DA-OCAML/ • Okasaki • Cousineau, Mauny • Chailloux, Manoury, Pagano • Édiscience/Dunod U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 6 • O’Reilly Biblio XU - ensiie - Prog. fonctionnelle 2011/2012 mais on va quand-même apprendre la syntaxe UN COURS D ’O CAML • Approche fonctionnelle de la programmation U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 5 COURS N’EST PAS CE • Développement d’applications avec OCaml XU - ensiie - Prog. fonctionnelle 2011/2012 Biblio XU - ensiie - Prog. fonctionnelle 2011/2012 Persistance =⇒ gestion mémoire efficace, très complexe, cachée • Boucle d’interaction � pratique • Interprété � vers bytecode, générique • Compilé � vers natif, efficace • Évaluation stricte • Fortement typé langages développé à l’INRIA http://caml.inria.fr • Fonctionnel + traits impératifs O CAML Haskell, Scheme, Lisp, ML, Erlang, Gallina. . . Programmation fonctionnelle ··· 0000000000000000000000010110111101000101010000111 ··· 0000000000000000000000010110111101000101010000111 ··· XU - ensiie - Prog. fonctionnelle 2011/2012 U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 11 XU - ensiie - Prog. fonctionnelle 2011/2012 Segmentation ? intuition U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 12 0010101011011111001101010000 ? 1000010101000101010101101000010111100010101000101 1000010101000101010101101000010111100010101000101 0010101011011111001101010000 ? 0010101011011111100010101000101111100011010100101 ··· intuition U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 10 0010101011011111100010101000101111100011010100101 En gros : Mémoire. . . XU - ensiie - Prog. fonctionnelle 2011/2012 ··· 0000000000000000000000010110111101000101010000111 1000010101000101010101101000010111100010101000101 0010101011011111100010101000101111100011010100101 1101010100010111100101010110111110011010100001110 En gros : Mémoire. . . 1101010100010111100101010110111110011010100001110 ··· intuition U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 9 exploration 1101010100010111100101010110111110011010100001110 En gros : Mémoire. . . XU - ensiie - Prog. fonctionnelle 2011/2012 Arithmétique. . . Comparaisons, opérations logiques. . . Valeurs basiques. . . Séparateur (expr) ;; • Déclarations → noms • Expressions → valeurs Programme = suite finie Noyau fonctionnel ;; XU - ensiie - Prog. fonctionnelle 2011/2012 condition U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 15 Remarque : branchement �= fonction logique if (2.718 > 3.141) then 666 else 42 ;; Égal à value1 si c vaut true Égal à value2 si c vaut false XU - ensiie - Prog. fonctionnelle 2011/2012 • Pas de conversion implicite U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 16 – Mêmes types pour comparaisons, etc. – Mêmes types des deux côtés dans branchement • Bon typage nécessaire : • Manipulation d’expressions (tout au même niveau) 3 + (if 42 <= 666 then 1 else -272) ;; expressions Type de c bool et même type pour value1 et value2 Encore des expressions ! Noyau fonctionnel U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 14 then true else false ;; XU - ensiie - Prog. fonctionnelle 2011/2012 condition (* vaut 42 *) expressions (0x2ff_df_aa = 50_323_370) or (3 < 666) ;; (* vaut 42 *) expressions U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 13 (ni segfault) if Remarque : branchement �= fonction logique if (2.718 > 3.141) then 666 else 42 ;; Égal à value1 si c vaut true Égal à value2 si c vaut false Type de c bool et même type pour value1 et value2 if c then value1 else value2 Branchement Noyau fonctionnel if c then value1 else value2 Branchement Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 sur même type typées exploration sur même type, sans implicite Fortement typé : jamais de problèmes de confusion Arithmétique. . . Comparaisons, opérations logiques. . . Valeurs basiques. . . Séparateur (expr) ;; • Déclarations → noms • Expressions → valeurs Programme = suite finie Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 portée {(toto,42),. . . } {(titi,666),(toto,42),. . . } {(titi,666),(toto,42),. . . } {(toto,42),. . . } U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 19 Identificateur viable dans expression interne let titi = 111 * 6 in titi * 666 * toto XU - ensiie - Prog. fonctionnelle 2011/2012 ici : capture let toto = 111 * 6 in toto * 666 * toto U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 20 {(toto,42),. . . } {(toto,666),(toto,42),. . . } {(toto,666),(toto,42),. . . } {(toto,42),. . . } let x = e1 in e2 expressions avec déclarations U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 18 portée {(toto,42),. . . } {(titi,666),(toto,42),. . . } {(titi,666),(toto,42),. . . } {(toto,42),. . . } let x = e1 in e2 Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 Identificateur viable dans expression interne let titi = 111 * 6 in titi * 666 * titi Donner un nom à une expression globalement ou localement expressions avec déclarations U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 17 {(toto,666),(titi,42),(toto,42),. . . } {(titi,42),(toto,42),. . . } {(toto,42),. . . } Donner un nom à une expression globalement ou localement Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 titi ? � 42 let toto = 666 Identificateur : expression let titi=toto let toto = 40 + 2 Jamais modifié car persistance (* x : nom de la valeur d’expr *) let x = e1 in e2 expressions avec déclarations let x = expr Noyau fonctionnel Donner un nom à une expression globalement ou localement déclarations Donner un nom à une expression globalement ou localement Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 Syntaxe application : (my_function my_param) 2. Évaluation du corps U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 23 (M N ) λx.M fonctions 1. Remplacement dans le corps du paramètre par une valeur Évaluation de l’application : déclarations U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 21 Un paramètre formel, ici x, un corps M (expression) Type : si M :β quand x:α alors type de fonction : α → β fun x -> M Objet comme les autres Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 let _ = e1 in e2 Donner un nom à une expression ou pas ... and y = e2 in let x = e1 Déclarations simultanées ... let y = e2 in let x = e1 in Enchaîner les déclarations Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 fonctions U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 24 let f = fun x -> (fun y -> M1) Retourner comme valeur. . . (M N ) U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 22 let f = fun x -> (x something) Prendre en paramètre. . . let f = fun x -> M Nommer. . . Objet comme les autres Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 Syntaxe application : (my_function my_param) 2. Évaluation du corps λx.M fonctions 1. Remplacement dans le corps du paramètre par une valeur Évaluation de l’application : Un paramètre formel, ici x, un corps M (expression) Type : type paramètre → type de la valeur du corps obtenue fun x -> M Objet comme les autres Noyau fonctionnel (ordre supérieur) Prendre en paramètre. . . U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 27 � fun y -> 1764 + y * y f2 42 XU - ensiie - Prog. fonctionnelle 2011/2012 � fun y -> 42 * 42 + y * y f1 42 Pas équivalentes pour application partielle let x2 = x * x in fun y -> x2 + y * y let f2 = fun x -> XU - ensiie - Prog. fonctionnelle 2011/2012 U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 28 � Nommages respectifs de 42, true et "Cooper" let (t1,t2,t3) = triplet;; Déstructuration let triplet = (42,true,"Cooper");; Types différents, taille fixe α × (β × γ) → δ �= α × β × γ → δ �= α → β → γ → δ (,,,,) t1 et t2 types : t1 × t2 type des couples (x1 , x2 ) avec x1 : t1 et x2 : t2 types produits U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 26 let f1 = fun x -> fun y -> x * x + y * y Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 let f x1 . . . xn = M Remarque. — Notation équivalente : Pas que des types de base. . . fonctions U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 25 (tant que → dans type) fonctions � Nouvelles fonctions dépendant de l’environnement à la création Procédé : clôture Remarque. — application partielle (f e1 · · · ek ) avec k < n Donc de type (au pire) : α1 → · · · → αn → β let f = fun x1 -> · · · -> fun xn -> M Noyau fonctionnel Remarque. — Pas d’évaluation « sous les λ » Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 (α → β) → γ �= α → (β → γ) Type : α → (β → γ) lorsque M 1 : γ sachant x : α et y : β let f = fun x -> (fun y -> M 1) Retourner comme valeur. . . Type : (α → β) → γ lorsque : something : α, x : α → β et M : γ sachant ça M �� � � let f = fun x -> (· · · (x something) · · · ) fonctions Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 i.real;; Accès : ident•field_name U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 31 let i = { real = 0.0 ; im : 1.0 } type cplx = { real : float ; im : float };; XU - ensiie - Prog. fonctionnelle 2011/2012 Motif : constructeurs + variables | ··· | motif2 -> e2 | motif1 -> e1 match valeur with Différencier par structure : filtrage (* Étiquette int *) (* MAJUSCULE *) U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 32 Filtrer : ∃? remplacement idoine (* Vus DANS L’ORDRE *) (* Tout ceci : expression *) | Ordinaire of int type rang = | Roi | Dame | Valet | Carreau | Trèfle type couleur = | Pique | Coeur constructeurs U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 30 Types produits avec noms de champs : enregistrements Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 let t2 : quadruplet = 4,3,2,1;; let t1 = 1,2,3,4;; Définir la structure d’une valeur. déclaration de types U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 29 déclarations de types type quadruplet = int * int * int * int;; Affirmation : ( ident : type ) Créer ses types. . . Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 • snd : α × β → β Élément de droite • fst : α × β → α Élement de gauche Déclaration : type t = type Fonctions d’accès : Noyau fonctionnel Créer ses types. . . types produits Cas particulier des paires Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 (* Même valeur *) U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 35 | Dame | Valet -> print_string "OK" | _ -> print_string "OK" XU - ensiie - Prog. fonctionnelle 2011/2012 Filtrer : ∃? remplacement idoine constructeurs U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 34 U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 36 (* Ordre donc en dernier *) print_string "Oooh" | Ordinaire toto -> | Ordinaire toto -> print_string "Oooh" | Roi -> print_string "Wow" ··· match x with let x = Motif : constructeurs + variables Pas de nom de valeur dans motifs Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 | Roi -> print_string "Wow" ··· Filtrer : ∃? remplacement idoine constructeurs U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 33 match x with let x = Motif : constructeurs + variables Pas de nom de valeur dans motifs Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 | Ordinaire y -> constructeurs Filtrer : ∃? remplacement idoine print_string "Oooh" | Roi -> print_string "Wow" print_string "Oooh" | Ordinaire toto -> ··· | Roi -> print_string "Wow" let y = 2 let x = Motif : constructeurs + variables Pas de nom de valeur dans motifs Noyau fonctionnel match x with ··· Filtrer : ∃? remplacement idoine constructeurs match x with let x = Motif : constructeurs + variables Pas de nom de valeur dans motifs Noyau fonctionnel motif -> ··· XU - ensiie - Prog. fonctionnelle 2011/2012 U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 39 Récursion non terminale : empilement non borné de * � risques n * (fact (n-1)) if n = 0 then 1 else let rec fact = fun n -> � (n + 1)! = (n + 1) × v • Hyp. n! = v • Cas de base : 0! = 1 Exemple : factorielle let rec f = · · · f · · · récursion U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 37 Fonction récursive : cas de base, hypothèse de récurrence Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 | _ -> · · · | C (Coeur, Dame) -> print_string "Qu’on lui coupe la tête !" match ident with (* Filtrage *) (* Déstructuration *) type carte = C of (couleur * rang) Structure profonde : let f = function motifS let f = fun récursion n) (n - 1) XU - ensiie - Prog. fonctionnelle 2011/2012 U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 40 Récursion terminale : jamais d’empilement trop gros let rec fact = fact_gen 1;; Cas particulier fact_gen (acc * if n = 0 then acc else let rec fact_gen = fun acc -> fun n -> � (f a (n + 1)) = (f (a × (n + 1)) n) = a × (n + 1) × n! = a × (n + 1)! • Hyp. ∀a, (f a n) = a × n! • Cas de base : ∀a, (f a 0) = a (* UN CAS PAR *) (* CONSTRUCTEUR *) U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 38 Propriété plus générale : ∀a, ∀n, (f a n) = a ∗ n! Exemple : factorielle Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 | Seg x -> · · · | Base -> · · · match ident with type tige = Base | Seg of tige • Construction du suivant • Cas de base En général : Type : description d’un plus petit ensemble clôt par construction ··· inductifs let f = fun x -> match x with Noyau fonctionnel Le constructeur construit. . . filtrage Expression donc utilisable partout Noyau fonctionnel 4 12 24 24 fact_gen fact_gen fact_gen fact_gen 0 1 2 3 4 XU - ensiie - Prog. fonctionnelle 2011/2012 induction terminal/non terminal U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 41 U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 43 Récursion terminale : jamais d’empilement trop gros 24 1 fact_gen fact 4 Exemple : factorielle Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 Distinction des cas : filtrage Hypothèse : on sait faire sur un constituant structurel • Suivant = Constructeur sur hyp. rec. • Cas de base = constructeurs de base Noyau fonctionnel * * * * 4 4 4 4 3 3 3 3 fact 3 * * * * 2 2 2 fact 2 B XU - ensiie - Prog. fonctionnelle 2011/2012 A Situation de départ Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 24 * 4 fact 4 Exemple : factorielle Noyau fonctionnel * * * * * 1 fact 0 U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 44 C illustration U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 42 1 1 fact 1 terminal/non terminal B B XU - ensiie - Prog. fonctionnelle 2011/2012 A Jamais de gros sur un petit : interdit Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 A C illustration U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 47 C illustration U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 45 Situation d’arrivée, un disque à la fois Noyau fonctionnel B B XU - ensiie - Prog. fonctionnelle 2011/2012 A Solution pour n disques ? Noyau fonctionnel XU - ensiie - Prog. fonctionnelle 2011/2012 A Jamais de gros sur un petit : OK Noyau fonctionnel U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 48 C illustration U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 46 C illustration principe de l’inférence XU - ensiie - Prog. fonctionnelle 2011/2012 - Concaténation linéaire - Appartenance linéaire + Ordre d’entrée conservé (FILO) + Ajout en tête en temps constant Structure dynamique Listes XU - ensiie - Prog. fonctionnelle 2011/2012 Type de f ? else f g (n-1) (g x); if n = 0 then x U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 51 Mal. . . Bien ! Mémoire premiers pas U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 49 let rec f = fun g -> fun n -> fun x -> Noyau fonctionnel Retrait XU - ensiie - Prog. fonctionnelle 2011/2012 Dans ce cours a::b::· · ·::k::[] [a;b;· · · ;k] Notation alternative de la valeur : Utilisation directe dans filtrage • Constructeur :: • Base [] Type ’a list natif dans Ocaml : Listes XU - ensiie - Prog. fonctionnelle 2011/2012 • Concaténation • Appartenance • Ajout (en tête ou pas) Fonctions • Construction e en tête de l • Vide Structure U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 52 premiers pas U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 50 Le mal On veut persistante Mémoire premiers pas Soit vide, soit élément et liste qui suit � passage au suivant Structure dynamique Listes XU - ensiie - Prog. fonctionnelle 2011/2012 Non terminal U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 55 Type : (α → β → β) → αlist → β → β fold_right f a1 ::a2 ::· · ·::an ::[] acc � f a1 (f a2 (· · · (f an acc) · · · )) Terminal fold_left f acc a1 ::a2 ::· · ·::an ::[] � f (· · · (f (f acc a1 ) a2 ) · · · ) an Type : (α → β → α) → α → βlist → α Exception: Division_by_zero exceptions # XU - ensiie - Prog. fonctionnelle 2011/2012 U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 56 éventuellement la reprendre sur une autre expression ! . . . pour interrompre une évaluation Exception: Invalid_argument . . . en cas de domaine de définition dépassé 1/0;; Terminal U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 54 fold composition d’applications de fonction par élément Noyau encore XU - ensiie - Prog. fonctionnelle 2011/2012 Opérations partielles : valeur exceptionnelle en cas d’erreur itérateurs U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 53 Parcours de structure, construction de résultat portant sur structure Listes XU - ensiie - Prog. fonctionnelle 2011/2012 Type : (α → β → α) → α → βlist → α fold_left f acc a1 ::a2 ::· · ·::an ::[] � f (· · · (f (f acc a1 ) a2 ) · · · ) an map f a1 ::a2 ::· · ·::an ::[] � (f a1 )::(f a2 )::· · ·::(f an )::[] Type : (α → β) → αlist → βlist fold composition d’applications de fonction par élément itérateurs map liste d’applications de fonction par élément Listes Parcours de structure, construction de résultat portant sur structure itérateurs Parcours de structure, construction de résultat portant sur structure Listes XU - ensiie - Prog. fonctionnelle 2011/2012 U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 57 raise (Terrible_erreur "subjonctif après « après que »") raise Toto Levée d’une exception : (mais pas polymorphe) exception Terrible_erreur of string XU - ensiie - Prog. fonctionnelle 2011/2012 ni e1 ni e2 évalués valeur e2 valeur e1 exceptions U N JEU DE SLIDES N ’ EST PAS UN POLY DE RÉFÉRENCE 58 • Non filtrée : exception propagée • Filtrée par Motif_exc alors calcul poursuivi 2. Levée dans e1 : 1. Évaluation de e1 , sans exception : calcul terminé try e1 with Motif_exc -> e2 exception Toto Noyau encore Rattrapage: construction try . . . with exceptions Définition : Noyau encore