# 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 !!!!!
vec3add(vec3lhs,vec3rhs){
returnapply_binop(+,lhs,rhs);
returnapply_operator(+,lhs,rhs);
}
vec3sub(vec3lhs,vec3rhs){
returnapply_binop(-,lhs,rhs);
returnapply_operator(-,lhs,rhs);
}
vec3mul(vec3lhs,vec3rhs){
returnapply_binop(*,lhs,rhs);
returnapply_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).
* Si on reprend la signature de notre fonction d'exemple, on a
```c
vec3apply_binop(binopop,vec3lhs,vec3rhs);
vec3apply_operator(operatorop,vec3lhs,vec3rhs);
```
* 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
<typeretour>(*<nomptrfonc>)(<typeparams(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
typedefdouble(*binop)(double,double);
typedefdouble(*operator)(double,double);
```
# Implémentation (suite)
* En reprenant notre fonction `apply_binop`, on a donc
* En reprenant notre fonction `apply_operator`, on a donc