approches fonctionnelles de la programmation - Évaluation ... if - sciences de base...programmation...

34
Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison Scoping Blocs Scoping Approches Fonctionnelles de la Programmation Évaluation et Scoping Didier Verna [email protected] http://www.lrde.epita.fr/˜didier 1/44

Upload: others

Post on 24-Sep-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Approches Fonctionnelles de laProgrammation

Évaluation et Scoping

Didier Verna

[email protected]://www.lrde.epita.fr/˜didier

1/44

Page 2: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Table des matières

1 Techniques d’évaluationLisp : Évaluation stricteHaskell : Évaluation lazyMérites comparés

2 ScopingStructure de blocsScoping lexical vs. dynamique

2/44

Page 3: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Lisp : évaluation stricteOrdre applicatif

Déroulement : « tree accumulation »I Évaluer les sous-expressions de gauche à droite

=) Processus récursifI Appliquer l’opérateur à ses arguments

En bas de l’arbre :I Données primitives (littéraux)I Opérateurs primitifs (built-in)

Environnement :I Valeurs d’expressions abstraitesI Les opérateurs primitifs en sont des cas particuliers

4/44

Page 4: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Exemple(2 + 4

*

6)

*

(x + 5 + 7)

(

*

(+ 2 (

*

4 6)) (+ x 5 7))

*4 6

+

2

24

15

57+

*

26

390

x3

5/44

Page 5: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Modèle de substitutionÉvaluation des expressions fonctionnelles

Définition :I Identique au cas précédentI

Substitution : (étape préalable)Remplacement des paramètres formels par lesarguments correspondants.

Remarques :I Substitution = vue de l’esprit.

Utilisation d’un environnement local pour lesparamêtres formels.

I Modèle formel mathématique de la substitution trèscomplexe (collision de noms). Cf. l -calcul.

7/44

Page 6: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Exemplef (5)

( defun sq ( x ) (⇤ x x ) )

( defun ssq ( x y ) (+ ( sq x ) ( sq y ) ) )

( defun f ( a )( ssq (+ a 1) (⇤ a 2 ) ) )

(f 5)

(ssq (+ a 1) (

*

a 2))

(ssq (+ 5 1) (

*

5 2))

(ssq 6 10)

(+ (sq x) (sq y))

(+ (sq 6) (sq 10))

(+ (

*

x x) (

*

x x))

(+ (

*

6 6) (

*

10 10))

(+ 36 100)

136

8/44

Page 7: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Opérateurs spéciauxExpressions à évaluation particulière

Contexte :I Problème : évaluation d’idiomes non stricts

(ex. branchements conditionnels)I Solution : opérateurs primitifs spéciaux

(comportement d’évaluation particulier)I Exemples : if, setq

Corollaire :I

Quotation : empêcher l’évaluation d’une expressionI Opérateur spécial quote, aussi noté ’

I Exemple : (special-operator-p ’if)

10/44

Page 8: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Puissance de la quotation– Dispatch

Méta-Expressions(expressions manipulant des expressions)– Dites-moi votre nom (prin1 your-name)

– Thierry Chmonfiss => “Thierry Chmonfiss”

– Dites-moi « votre nom » (prin1 ’your-name)

– Votre nom => your-name

Utilité :I RéflexivitéI Code () DonnéesI MacrosI Calcul symbolique(list a b c) 6= ’(a b c)

11/44

Page 9: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Méandres de la quotation– « Spatch » !

Propagation de la notion d’égalité :– Trois égal deux plus un ?(= 3 (+ 2 1)) => T

– « Trois » égal « deux plus un » ?(= ’3 ’(+ 2 1)) => nil

Inférence sur des prédicats :« Les jazzmen sont d’excellents musiciens. »– John Scofield est un jazzman.) John Scofield est un excellent musicien.– Thierry sait que John Scofield est un jazzman.) Thierry sait-il que John Scofield est un excellentmusicien ?

12/44

Page 10: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Haskell : Évaluation lazyOrdre normal

Modèle de substitution :I Remplacement des paramètres formels par les

arguments correspondantsMais :

I Arguments non évaluésI Évaluation « à la demande »

(aussi vrai pour les agrégats)Attention :

I Évaluation unique des expressions(travail sur un graphe d’évaluation)

I Fonctionnel pur uniquement

13/44

Page 11: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Exemplef (5)

sq : : Float �> Floatsq x = x ⇤ x

ssq : : Float �> Float �> Floatssq x y = sq x + sq y

f : : Float �> Floatf a = ssq ( a + 1) ( a ⇤ 2)

f 5

ssq (a + 1) (a

*

2)

ssq (5 + 1) (5

*

2)

sq x + sq y

sq (5 + 1) + sq (5

*

2)

(x

*

x) + (y

*

y)

(5 + 1)

*

(5 + 1) + (5

*

2)

*

(5

*

2)

6

*

6 + 10

*

10

36 + 100

136

14/44

Page 12: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Graphe d’évaluationÉvaluation unique des paramètres

+x * x y * y

x * x y * y

5 + 1 5 * 2

ssq x y

sq x sq y

ssq (5 + 1) (5

*

2)

sq (5 + 1) + sq (5

*

2)

(5 + 1)

*

(5 + 1) + (5

*

2)

*

(5

*

2)

6

*

6 + 10

*

10

16/44

Page 13: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Évaluation d’équations multiplesPattern Matching

f p1 p2 p3 ... = e1

f q1 q2 q3 ... = e2

...

Équation utilisée : la première offrant un matchingentre les arguments et les formes paramétriquesÉvaluation :

I Seuls les arguments nécessaires à la décisionI Seuls les morceaux d’agrégats nécessaires

18/44

Page 14: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Évaluation minimum des argumentsExemple 1

foo : : Floatfoo = 2 ⇤ foo

prod : : Float �> Float �> Floatprod x 0 = 0prod 0 y = 0prod x y = x ⇤ y

prod 3 4 => (3) 12.0

prod 4 0 => (1) 0.0

prod foo 0 => (1) 0.0

prod 0 foo => Stack overflow

19/44

Page 15: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Évaluation d’équations multiplesPattern Matching

f p1 p2 p3 ... = e1

f q1 q2 q3 ... = e2

...

Équation utilisée : la première offrant un matchingentre les arguments et les formes paramétriquesÉvaluation :

I Seuls les arguments nécessaires à la décisionI Seuls les morceaux d’agrégats nécessaires

20/44

Page 16: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Évaluation partielle des argumentsExemple 2

sh : : [ I n t ] �> [ I n t ] �> I n tsh [ ] ys = 0sh ( x : xs ) [ ] = 0sh ( x : xs ) ( y : ys ) = x + y

sh [1..3] [5..8]

(1) => sh (1:[2..3]) [5..8]

(2) => sh (1:[2..3]) (5:[6..8])

(3) => 1 + 5

=> 6

21/44

Page 17: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Évaluation des guardesC’est pareil

max3 : : I n t �> I n t �> I n t �> I n tmax3 m n p

| (m >= n ) && (m >= p ) = m| ( n >= m) && ( n >= p ) = n| otherwise = p

max3 (2+3) (4-1) (3+9)

(1) => (2+3)>=(4-1) && (2+3)>=(3+9)

=> 5>=(4-1) && 5>=(3+9)

=> 5>=3 && 5>=(3+9)

=> True && 5>=(3+9)

=> True && 5>=12

=> True && False

=> False

(2) => 3>=5 && 3>=12

=> False && 3>=12

=> False

(3) => 1222/44

Page 18: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

ApplicationNewton-Raphson

n r s q r t : : Float �> Float �> Floatn r s q r t x de l t a = n r f i n d x ( n r l i s t x ) de l t a

n r f i n d : : Float �> [ Float ] �> Float �> Floatn r f i n d x ( yn : ys ) de l t a

| nrhappy yn x de l t a = yn| otherwise = n r f i n d x ys de l t a

nrhappy : : Float �> Float �> Float �> Boolnrhappy yn x de l t a = abs ( x � yn ⇤ yn ) <= de l t a

n r l i s t : : Float �> [ Float ]n r l i s t x = n r b u i l d 1.0 ( nrnext x )

n r b u i l d : : Float �> ( Float �> Float ) �> [ Float ]n r b u i l d yn f = yn : n r b u i l d ( f yn ) f

nrnex t : : Float �> Float �> Floatnrnext x yn = ( yn + x / yn ) / 2

23/44

Page 19: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Évaluation stricte vs. lazyLes vrai-faux arguments

L’évaluation stricte évite la redondance de calculsI Vrai, mais l’ordre normal aussi

(Cf. graphes d’évaluation)L’évaluation lazy dispense d’opérateurs spéciaux

I Vrai, mais les macros (programmatiques) de Lisprattrappent le coup. . . (ex. unless)

Haskelli f n o t : : Bool �> a �> a �> ai f n o t t e s t e1 e2 = i f t e s t then e2 else e1

Lisp( defmacro i f n o t ( t e s t e1 e2 )

( l i s t ’ i f t e s t e2 e1 ) )

24/44

Page 20: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Évaluation stricte vs. lazyLes vrai-vrais arguments

Théorème de Church-Rosser : (Cf. l -calcul)Les deux méthodes sont équivalentes (donnent lemême résultat) en fonctionnel pur.Évaluation stricte :

I De l’intérieur vers l’extérieur ; de gauche à droiteI seul utilisable en fonctionnel impur

(dépendance vis-à-vis de l’ordre d’évaluation)Évaluation lazy :

I De l’extérieur vers l’intérieur ; de gauche à droiteI abstractions supplémentaires

(ex. types infinis)

25/44

Page 21: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Un point sur le vocabulairestrict, lazy, applicatif, normal. . .

Ordre applicatif/ normal : sémantique des langagesStrict : se dit surtout d’une procédure / fonctionLazy : se dit surtout d’un évaluateur

Dans un langage d’ordre applicatif, toutes lesprocédures sont strictes.Dans un langage d’ordre normal, toutes les procéduresnon primitives sont non strictes (puisque l’évaluateurest lazy), et les procédures primitives peuvent êtrestrictes, ou pas.

Vous me suivez ?

26/44

Page 22: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Environnement global vs. localL’environnement global est insuffisant

Contextes locaux implicites :I Arguments des fonctions (a-conversion, imbrication)

Lisp

( defun sq ( x ) (⇤ x x ) )( defun sq ( y ) (⇤ y y ) )

Lisp

( defun sq ( x ) (⇤ x x ) )( defun f ( x ) ( sq ( / 1 x ) ) )

Contextes locaux explicites :I Données locales

(éviter la redondance d’évaluation)I Fonctions locales

(éviter la pollution des espaces de noms)

28/44

Page 23: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Structure de blocsOù chercher une expression nommée

Bloc :ensemble de liaisons [ nom – expression ]Environnement d’évaluation :structure de blocs imbriquésVariable liée :définie dans le contexte (bloc) localVariable libre :non définie localementScoping : capture d’une variable libre(recherche d’une liaison dans le bloc le plus « proche »)

Remarque : la notion de « proximité » reste à définir. . .

29/44

Page 24: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Contextes locaux explicitesTrop d’imbrication tue l’imbrication

Lisp( defun f ( x )

( l e t ( ( a (⇤ x x ) )( b (+ (⇤ x x ) 1 ) ) )

(+ ( / a b ) ( / b a ) ) ) )

Lisp( defun f ( x )

( l e t⇤ ( ( a (⇤ x x ) )( b (+ a 1 ) ) )

(+ ( / a b ) ( / b a ) ) ) )

Haskellf : : Float �> Floatf x = l e t a = x ⇤ x

b = a + 1in a / b + b / a

Haskellf : : Float �> Floatf x = a / b + b / a

where a = x ⇤ xb = a + 1

Lisp : pas de références mutuelles dans let(utiliser let

*

).Haskell : ordre des définitions sans importance

30/44

Page 25: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Contextes locaux fonctionnelsRappel : les fonctions sont des objets de 1re classe. . .

Haskell : let et where peuvent contenir des fonctions(y compris les déclarations de type).Lisp : utiliser labels

Lisp( defun ssq ( x y )

( labels ( ( square ( x ) (⇤ x x ) ) )(+ ( square x ) ( square y ) ) ) )

Haskellssq : : Float �> Float �> Floatssq x y = square x + square y

where square x = x ⇤ x

Remarque : référencement mutuel dans labelpossible

31/44

Page 26: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Pattern matching sur les déclarationsEn Lisp comme en Haskell

Haskell : assignation par pattern matchingLisp : destructuring-bind

(formes correspondantes à des listes d’arguments defonctions)

Lisp( defun foo ( l )

( des t ruc tu r ing�b ind ( a . b ) l( mapcar ( lambda ( x ) (⇤ x a ) ) b ) ) )

Haskellfoo : : [ I n t ] �> [ I n t ]foo l = map (⇤a ) b

where ( a : b ) = l

32/44

Page 27: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Portée des nomsAttention aux collisions

let lie plus fort les variables déjà liées

Lisp( defvar x 5)

( defvar y ; ; y = 8

(+ ( l e t ( ( x 3 ) ) x ) ; ; x = 3

x ) ) ; ; x = 5

Haskellx : : I n tx = 5

y : : I n t �� y = 8

y = ( l e t x = 3 in x ) �� x = 3

+ x �� x = 5

33/44

Page 28: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Portée des noms (suite)Attention aux collisions

Lisp : valeurs locales calculées à l’extérieur de let

(pas en Haskell)let (Haskell) plus proche de let

*

(Lisp)

Lisp( defvar x 2)

( defvar y( l e t ( ( x 3) ; ; x = 3

( z (+ x 2 ) ) ) ; ; z = 2 + 2

(⇤ x z ) ) ) ; ; y = 3 ⇤ 4

Lisp( defvar x 2)

( defvar y( l e t⇤ ( ( x 3) ; ; x = 3

( z (+ x 2 ) ) ) ; ; z = 3 + 2

(⇤ x z ) ) ) ; ; y = 3 ⇤ 5

Haskellx : : I n tx = 2

y : : I n ty = l e t x = 3 �� x = 3

z = x + 2 �� z = 3 + 2

in x ⇤ z �� y = 3 ⇤ 5

34/44

Page 29: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Formes de scopingRecherche d’une liaison [nom – expression]

Lexical : recherche dans l’environnement de définition

Dynamique : recherche dans l’environnement d’appel

Lisp( l e t ( ( x 10) )

( defun foo ( ) x ) )

( l e t ( ( x 20) )( foo ) ) ; ; => 10

Lisp( defparameter x 10)( defun foo ( ) x )

( l e t ( ( x 20) )( foo ) ) ; ; => 20

35/44

Page 30: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Fermetures lexicalesAKA lexical closures

Définition :Combinaison entre une fonction et son environnementde définition (valeurs des variables libres au momentde la définition).Intérêts :

I Opérations génériques par fonctions anonymesmapping, folding etc. : fermetures lexicales quis’ignorent

I Création dynamique de fonctions à état localI Encapsulation (portée restreinte)

Remarque : (Lisp) Environnement lexical modifiable

36/44

Page 31: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Intérêts des fermetures lexicalesElles sont partout. . .

Opérations génériques par fonctions anonymes :

Lisp( defun l i s t + ( l s t n )

( mapcar # ’ ( lambda ( x ) (+ x n ) )l s t ) )

Haskell(+++) : : [ I n t ] �> I n t �> [ I n t ](+++) l s t n = map ( \ x �> x + n ) l s t

�� map (+n ) l s t

Création dynamique de fonctions à état local :

Lisp( defun make�adder ( n )

# ’ ( lambda ( x ) (+ x n ) ) )

HaskellmakeAdder : : I n t �> I n t �> I n tmakeAdder n = \ x �> x + n

État local modifiable :

Lisp( l e t ( ( cn t 0 ) )

( defun newtag ( ) ( incf cnt ) )( defun rese t tag ( ) ( setq cnt 0 ) ) )

37/44

Page 32: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Lisp : scoping dynamiqueC’est mon choix (et je le partage)

Historiquement : première forme de scopingDepuis scheme : scoping lexical par défautCommon Lisp : scoping dynamique possible

I Variables globales (defvar, defparameter)I Variables locales déclarées « spéciales »

( l e t ( ( x 10) )( defun foo ( ) x ) )

( l e t ( ( x 20) )( foo ) ) ; ; => 10

( l e t ( ( x 10) )( defun foo ( )

( dec lare ( spec ia l x ) )x ) )

( l e t ( ( x 20) )( foo ) ) ; ; => 20

42/44

Page 33: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Pour ou contre le scoping dynamique ?Ça dépend. . .

Avantages :I Variables globales !

Options Emacs (ex. case-fold-search etc.)Inconvénients :

I Énorme source de bugs très difficiles à pisterProblème de collision de noms (« name clash »)

I Le premier exemple de fonction d’ordre supérieurdonné par Mc Carthy était faux !

43/44

Page 34: Approches Fonctionnelles de la Programmation - Évaluation ... IF - Sciences de base...Programmation Fonctionnelle Didier Verna EPITA Techniques d’évaluation Stricte Lazy Comparaison

ProgrammationFonctionnelle

Didier VernaEPITA

Techniquesd’évaluationStricte

Lazy

Comparaison

ScopingBlocs

Scoping

Le (mauvais) exemple de Mc CarthyL’ancêtre de mapcar

Lisp( defmacro whi le ( t e s t &rest body )

‘ ( do ( ) ( ( not , t e s t ) ),@body ) )

( defun my�mapcar ( func l s t )( l e t ( e l t n )

( wh i le ( setq e l t (pop l s t ) )(push ( funcal l func e l t ) n ) )

( nreverse n ) ) )

( defun l i s t + ( l s t n )(my�mapcar # ’ ( lambda ( x )

( dec lare ( spec ia l n ) )(+ x n ) ) ; ; Bar f ! !

l s t ) )

44/44