From 6b14125308fafc24f600a7c6ca825dd5ee5c2c03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20El=20Kharroubi?= <michael.el-kharroubi@hesge.ch> Date: Mon, 21 Feb 2022 22:37:33 +0100 Subject: [PATCH] Applied @orestis.malaspin corrections. --- slides/fonctions_dordre_superieur.md | 47 ++++++++++++++++++---------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/slides/fonctions_dordre_superieur.md b/slides/fonctions_dordre_superieur.md index 87fae8e..0f8e540 100644 --- a/slides/fonctions_dordre_superieur.md +++ b/slides/fonctions_dordre_superieur.md @@ -87,7 +87,7 @@ vec3 mul(vec3 lhs, vec3 rhs){ ```c typedef struct _vecn { int size; - double* xs; + double *xs; } vecn; ``` @@ -95,12 +95,13 @@ typedef struct _vecn { # Fonction d'ordre supérieur (solution au problème) -* Pour notre problème, nous aimerions donc découpler l'opération binaire (opération entre deux termes : +,-,*) de l'itération sur les composantes. +* Pour notre problème, nous aimerions donc découpler l'opération (opération entre deux termes : +,-,*) de l'itération sur les composantes. * Ce qui nous donne conceptuellement en pseudo c ```c -vec3 apply_binop(binop op, vec3 lhs, vec3 rhs){ +// Attention pseudo c, ne compile pas !!!!! +vec3 apply_operator(operator op, vec3 lhs, vec3 rhs){ vec3 res; res.x = lhs.x op rhs.x; res.y = lhs.y op rhs.y; @@ -111,17 +112,18 @@ vec3 apply_binop(binop op, vec3 lhs, vec3 rhs){ # Fonction d'ordre supérieur (solution au problème) -* Avec notre fonction conceptuelle `apply_binop`, on pourrait faire +* Avec notre fonction conceptuelle `apply_operator`, on pourrait faire (toujours en pseudo c) ```c +// Attention pseudo c, ne compile pas !!!!! vec3 add(vec3 lhs, vec3 rhs){ - return apply_binop(+, lhs, rhs); + return apply_operator(+, lhs, rhs); } vec3 sub(vec3 lhs, vec3 rhs){ - return apply_binop(-, lhs, rhs); + return apply_operator(-, lhs, rhs); } vec3 mul(vec3 lhs, vec3 rhs){ - return apply_binop(*, lhs, rhs); + return apply_operator(*, lhs, rhs); } ``` @@ -131,7 +133,7 @@ vec3 mul(vec3 lhs, vec3 rhs){ * Une fonction d'ordre supérieur est une fonction qui prend en paramètre et/ou retourne une(des) autre(s) fonction(s). -* Si on essayait de définir `binop`, c'est en fait une fonction qui prend deux paramètres (un terme de gauche et un terme de droite). On s'en aperçoit clairement avec la notation préfix (polonaise). +* Si on essayait de définir `operator`, c'est en fait une fonction qui prend deux paramètres (un terme de gauche et un terme de droite). On s'en aperçoit clairement avec la notation préfix (polonaise). * `L + R` -> `+ L R` * `L - R` -> `- L R` * `L * R` -> `* L R` @@ -143,10 +145,10 @@ vec3 mul(vec3 lhs, vec3 rhs){ * Si on reprend la signature de notre fonction d'exemple, on a ```c -vec3 apply_binop(binop op, vec3 lhs, vec3 rhs); +vec3 apply_operator(operator op, vec3 lhs, vec3 rhs); ``` -* Nous avons déterminé que les `binop` étaient des fonctions qui prennaient deux paramètres. +* Nous avons déterminé que les `operator` étaient des fonctions qui prennaient deux paramètres. * Pour passer une fonction en paramètre en C, nous devons la passer par référence, c'est à dire à l'aide d'un pointeur de fonction. @@ -159,18 +161,18 @@ typedef <type retour> (*<nom ptr fonc>)(<type params(s)>); ``` -* Dans notre cas, nous avons donc un type de fonction nommé `binop`, qui prend en entrée deux `double`{.c} et qui retourne un `double`{.c}. Ce qui nous donne +* Dans notre cas, nous avons donc un type de fonction nommé `operator`, qui prend en entrée deux `double`{.c} et qui retourne un `double`{.c}. Ce qui nous donne ```c -typedef double (*binop)(double, double); +typedef double (*operator)(double, double); ``` # Implémentation (suite) -* En reprenant notre fonction `apply_binop`, on a donc +* En reprenant notre fonction `apply_operator`, on a donc ```c -vec3 apply_binop(binop op, vec3 lhs, vec3 rhs){ +vec3 apply_operator(operator op, vec3 lhs, vec3 rhs){ vec3 res; res.x = op(lhs.x, rhs.x); res.y = op(lhs.y, rhs.y); @@ -184,9 +186,9 @@ vec3 apply_binop(binop op, vec3 lhs, vec3 rhs){ # Résultat ```c -typedef double (*binop)(double, double); +typedef double (*operator)(double, double); -vec3 apply_binop(binop op, vec3 lhs, vec3 rhs){ +vec3 apply_operator(operator op, vec3 lhs, vec3 rhs){ vec3 res; res.x = op(lhs.x, rhs.x); res.y = op(lhs.y, rhs.y); @@ -197,6 +199,17 @@ vec3 apply_binop(binop op, vec3 lhs, vec3 rhs){ double add_dbl(double lhs, double rhs){return lhs + rhs;} vec3 add(vec3 lhs, vec3 rhs){ - return apply_binop(add_dbl, lhs, rhs); + return apply_operator(add_dbl, lhs, rhs); } ``` + +# Fonctions d'ordre supérieur appliquées aux tableaux + +* Comment appliquer des opérations sur un vecteur de taille n? + * Map (application d'une fonction) + * `add_one`, `square` + * Filter (discrimination selon un prédicat) + * `is_even`, `is_lower_than_five` + * Reduce (réduction d'un vecteur à un seul élément) + * `sum`, `multiply` + \ No newline at end of file -- GitLab