IFT359 – Programmation fonctionnelle Thème 07 Fermeture, affectation ou monades 1.

Slides:



Advertisements
Présentations similaires
Explorer un espace d’états
Advertisements

Portée des variables VBA & Excel
Conception de Programmes Evolutifs Pré Soutenance de TER Année Encadrants : Cathy Escazut et Michel Gautero Auteurs: Paul-Kenji Cahier Sylvain.
Conception de Programmes Evolutifs Pré Soutenance de TER Année Encadrants : Cathy Escazut et Michel Gautero Auteurs: Paul-Kenji Cahier Sylvain.
Conception de Programmes Evolutifs
(Classes prédéfinies – API Java)
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
C.
Introduction à la programmation (420-PK2-SL) cours 15 Gestion des applications Technologie de linformation (LEA.BW)
CSI3525: Concepts des Langages de Programmation Notes # 5: Langages de Programmation Fonctionelle I: Introduction au Scheme.
Active Directory Windows 2003 Server
Principes de programmation (suite)
Points importants de la semaine Les fonctions. La portée. La passage par copie. Les tableaux.
Cours 7 - Les pointeurs, l'allocation dynamique, les listes chaînées
Un langage de programmation fonctionnelle
Structures de données linéaires
OCaml - Les listes L3 MI.
Récursivité.
Algorithmique et Programmation
CSI3525: Concepts des Langages de Programmation Notes # 12: Implementation des Sous-Programmes ( Lire Chapitre 9 )
Points importants de la semaine Le paramétrage. La portée. Le passage par copie. Le passage par référence.
Programmation fonctionnelle Le langage LISP
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction.
Les Fonctions. Définir une fonction Sections de code indépendantes que lon peut appeler à nimporte quel moment et dans nimporte quel ordre. Bout de code.
Sixième cours Les chaînes de caractères et le passage de paramètres par référence Passage de paramètres par référence String.h.
Points importants de la semaine Les constantes de compilation. Les fonctions.
IFT 6800 Atelier en Technologies d’information
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Parallel Programming in C with MPI and OpenMP
Chapitre 9 Les sous-programmes.
Méthode et Outils pour la Programmation
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Modélisation des opérations Spécifier les transformations détat que lon attend des services de la machine Létat dune machine entièrement déterminée par.
Procédures et fonctions
Plan cours La notion de pointeur et d’adresse mémoire.
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.
PHP 2° PARTIE : FONCTIONS ET FORMULAIRE
Animateur : Med HAIJOUBI
Le langage C Structures de données
CSI2520  cdr vers le bas, cons vers le haut (define (traite-liste L) (if (null? L) () (cons (traite (car L)) (traite-liste (cdr L)))))
La notion de type revisitée en POO
CSI2520  Cette fonction permet d’attribuer une valeur à une variable (set! nombre (+ 3 4)) (set! nombre (+ 1 nombre)) En SCHEME, les fonctions dont le.
Créer des packages.
420-B63 Programmation Web Avancée Auteur : Frédéric Thériault 1.
Tutorat en bio-informatique
Le langage Racket (Lisp)
Programmation Système et Réseau
Méthodes et outils de conception Introduction à la programmation Paramètre de retour Appel d’une fonction Portée des variables Définition Pourquoi les.
CSI 3525, Implémentation des sous-programmes, page 1 Implémentation des sous-programmes L’environnement dans les langages structurés en bloc La structure.
ISBN Chapitre 10 L'implémentation des sous- programmes.
Évaluation et application des fonctions Let f = function x -> ( function y -> x+y );; Type :int -> (int ->int) int -> int ->int f int.
CSI2520 Un langage de programmation par scripting orienté-objet (et fonctionnel)
1 Système d’exploitation Les scripts csh 1 ère Année Année Tienté HSU.
CSI2520 (map abs ‘( )) ( ) (map (lambda (x y) (* x y)) ‘( ) ‘( )) ( )  Permet d’appliquer une fonction aux.
 Formulaires HTML : traiter les entrées utilisateur
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
6ième Classe (Mercredi, 17 novembre) CSI2572
La récursivité Mireille Goud HEG Vd AlgSD - Résurisivité.
UE MAREP Cours 8 : La pile d’exécution (Fonctions imbriquées et fonctions récursives) Patricia Renault UPMC 2005/2006.
Visibilité de variables Paramètres de fonction premier auteur : Agata Savary.
Organisation de la mémoire pour le langage minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
IFT359 – Programmation fonctionnelle Thème #6 Appel terminaux 1.
1 UNIX AVANCE Yves PAGNOTTE – Janvier – LES PROCESSUS SOUS UNIX.
Informatique 1A Langage C 6 ème séance 1. Objectifs de la séance 6  Allocation dynamique de mémoire  Application à la création de tableaux 2.
IFT359 – Programmation fonctionnelle Thème #8 Création de nouvelles formes syntaxiques 1.
IFT359 – Programmation fonctionnelle Thème #10 Évaluation par environnement et évaluateur méta-circulaire 1.
IFT359 – Programmation fonctionnelle exercice backquote, unquote, unquote-splicing 1.
IFT359 – Programmation fonctionnelle Thème 02 B partie A introduction au langage fonctionnel choisi 1.
Transcription de la présentation:

IFT359 – Programmation fonctionnelle Thème 07 Fermeture, affectation ou monades 1

Rappel : variable et environnement On appelle liaison l’association entre une variable et sa valeur – e.g. la variable x est liée à la valeur 3. On appelle environnement l’ensemble des liaisons accessibles à un moment donné –L’environnement est représenté par des boîtes s’emboitant les unes dans les autres et chaque boîte est aussi appelé environnement. L’environnement global contient des liaisons prédéfinies (+, -, list, map, etc.) define permet d’ajouter des liaisons dans l’environnement courant –On ne peut pas ajouter de define partout dans le code Chaque application ((λ(id …) body …) val …) crée un environnement pointant sur l’environnement dans lequel (λ(id …) body …) a été évalué et contenant les liaisons id  val … –Les val … sont évalués avant la construction de ce nouvel environnement donc dans l’environnement courant au moment de l’évaluation de l’application. 2

Variables libres (free) / liées (bound) (define a 3) (let ([x 5]) (λ (y) (+ x y a))) (let ([z (+ a 2)]) (λ (a) (- z a))) Dans les les 0 sont des variables libres et les _ sont des variables liées. 3

Fermeture (closure) Ce n’est pas un nouveau concept dans ce cours, nous faisons que donner un nom à ce que nous avons expliqué. Fermeture : code + environnement –une fermeture contient le code de la fonction et l’environnement dans lequel la fonction est définie, i.e. les liaisons existantes des variables lors de son évaluation (ne pas confondre avec son application). Toutes les évaluation de λ créent une fermeture mais on réserve en général ce terme pour désigner les λ définies dans un environnement autre que l’environnement global. –Par exemple, les λ définies dans le corps d’un let. 4

Portée statique (static or lexical scope) En gros, comme en C/Java –La portée est définie au moment de la compilation et non de l’exécution (let ([a 5]) (let ([f (λ (x) (+ x a))] [a 0]) (f 10))) –La portée statique donnera 15 tandis que la porté dynamique donnerait 10 5

Visibilité d’une liaison (define a 1) (define f (λ (x) (+ x 1))) (let ([x a] [y 20]) (let* ([u (+ x y)] [v (+ a u)] [a (f 5)]) (list a (f a) x y u v))) La plus récente liaison cache (shadows) les précédentes 6

Affectation Attention, son utilisation dans le cours est permises uniquement au cas par cas ! (set! id exp) –Comme define, set! produit # Modifie la liaison : –Qu’elle soit globale (créé par un define) –ou locale (paramètre d’une λ) n’oubliez pas que les let sont des λ déguisés Le suffixe ! est ajouté aux procédures qui ont des effets de bord 7

Affectation Ce n’est pas un pointeur sur n qui est passé en paramètre mais la valeur de n Ce n’est pas la variable qui porte le type, mais la valeur elle-même (define x 3) (set! x #t) x -> #t DrRacket fait du passage par valeur (define n 5) (define f (λ (n) (set! n (+ n 1)))) (f n) n -> 5 8

Affectation et évaluation par environnement (define i 0) (define inc! (λ () (set! i (+ i 1)))) (inc!) i  1 Env initial i  0 inc var : aucune corps : (set! i (+ i 1))) (set! i(+ i 1)) 9

Affectation et évaluation par environnement ((let ([a 3]) (λ (b) (set! a b) a)) 8) Step 1 : transformer les let en λ Step 2 : réduire les applications a: évaluer tous les termes de l’application b: créer un env. pointant sur celui de la fonction c: associer dans cet env les vars à leurs valeurs d: évaluer par env le corps de la fonction dans environnement. (((λ (a) (λ (b) (set! a b) a)) 3) 8) 10

Affectation et évaluation par environnement 11 (((λ (a) (λ (b) (set! a b) a)) 3) 8) v : a c: (λ (b) (set! a b) a) a  3 8 v : b c: (set! a b) a b  8 Env. global évaluation de 8 évaluation de ((λ (a) …) 3) évaluation de 3 évaluation de (λ (a) …) création de l’env et association var val eval par env du corps de (λ (a) …) eval par env de (λ (b) …) ce dernier résultat est retourné création de l’env et association var val eval par env du corps de (λ (b) …) eval de (set! a b) eval de a ce dernier résultat est retourné FIN

Durée de vie d’une liaison (extent) La durée de vie est illimitée –Comme les variables statiques en C et non les variables auto (par défaut). –le ramasse-miettes (garbage collector) doit prouver qu’une liaison peut être éliminée (define f (let ([a 10]) (λ () (let ([c a]) (set! a (add1 a)) c)))) (f)  10 (f)  11 Toutes les variables nécessaires pour définir la fermeture de f sont conservées tant que f existe 12

compte-appel Définir une procédure qui retourne le nombre le fois où elle a été appelée –Sans utiliser une variable globale (define compte-appel (let ([n 0]) (λ () (set! n (add1 n)) n))) (define compte-appel ((λ (n) (λ () (set! n (add1 n)) n)) 0)) compte-appel v: n c : (λ () (set! n (add1 n)) n)) n  0 v: nil c: (set! n (add1 n)) n 13

GARDER COMME ARGUMENT LE RÉSULTAT PARTIEL DANS UNE FONCTION AUXILIAIRE RÉCURSIVE, Astuce 14

Reverse 15 (define reverse (λ (lst) (let iter ([reste lst] [res '()]) (if (null? reste) res (iter (cdr reste) (cons (car reste) res))))))

Factoriel 16 (define fact (λ (n) (let iter ([res 1] [k n]) (if (> k 0) (iter (* k res) (sub1 k)) res))))

Length 17 (define length (λ (lst) (letrec ([iter (λ (reste res) (cond [(null? reste) res] [else (iter (cdr reste) (add1 res))]))]) (iter lst 0))))

Fibonacci 18 (define (fib n) (letrec ([iter (λ (a b compteur) (if (= compteur 0) b (iter (+ a b) a (- compteur 1))))]) (iter 1 0 n))) (define (fib n) (let iter ([a 1] [b 0] [compteur n]) (if (= compteur 0) b (iter (+ a b) a (- compteur 1)))))

foldl 19 (define foldl (λ (proc init lst) (let iter ([reste lst] [res init]) (if (null? reste) res (iter (cdr reste) (proc (car reste) res)))))) (define foldl (λ (proc init lst) (if (null? lst) init (foldl proc (proc (car lst) init) (cdr lst))))) code donné comme exemple mais ce n’est pas la façon la plus élégante de définir foldl. voir ci-dessous