This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Quotation : empêcher l’évaluation d’une expressionI Opérateur spécial quote, aussi noté ’
I Exemple : (special-operator-p ’if)
10/44
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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. . .