je trouve l'exemple de flob mal choisi; appeler new rend deja la fonction impure, et c'est le comprtement de new qui est deja impur dans ta méthode.
par exemple, une fonction pure devrait en permanence retourner le même pointeur si tu l'appelles avec les mêmes paramètres, ce que new ne fait pas.
pour un exemple plus simple, prenons la méthode "acos"; acos a une valeur d'entrée qui doit être comprise entre -1 et 1, au dela le résultat est (un nombre complexe mais en général on s'en fout) indéfini.
la méthode:
1 2 3 4 5 6 7
| float acos(float x)
{
if(x < -1 || x > 1)
throw MathError(x);
else
return (developpement de taylor de x);
} |
cette fonction peut être considérée comme pure; si tu appelles acos(-2) elle fera toujours la même chose, a l'infini. si tu appelles acos(0.1) aussi. pas comme new(int) ou etc etc.
cependant même si d'un certain point de vue cette méthode est pure, la pureté dans certains langages est utilisée pour mettre un résultat en cache et ne pas rappeler la fonction; par exemple, les vieux jeux vidéo avaient une table de cos(x) pour x entre 1 et 180 pour ne pas recalculer cos(x). Or, c'est possible seulement parce que cos(x) est pure. Si une exception est levée par une méthode, même si c'est systématique, il va etre difficile d'utiliser une fonction pure comme une fonction pure; en effet, si acos(x) renvoie une exception, elle ne renvoie pas le résultat; il faudrait donc un systéme de cache qui est capable de traiter les cas exceptionnels aussi.
float sqrcos = cos(x)*cos(x);
ce code pourra etre optimisé puisque cos est pure;
float sqracos = acos(x)*acos(x);
celui la possiblement aussi puisque l'exception n'est pas traitée;
au dela de ces exemples simples cela commencera a ressembler a un casse tête pour le compilateur. Autant dire que même si dans la logique c'est pur, dans les faits ca ne sera sans doute pas une fonction pure.
Partager