Ordre d'évaluation des arguments
Dans un langage fonctionnel pur, l'ordre d'évaluation des arguments
n'a pas d'importance. Comme il n'y a ni modification d'état mémoire, ni rupture de calcul, il
n'y a aucun risque d'influence du calcul d'un argument sur un autre.
Par contre en Objective CAML, où il existe des valeurs modifiables
physiquement et des exceptions,
il y a péril à ne pas tenir compte de l'ordre d'évaluation des
arguments. L'exemple
suivant est spécifique
à la version 2.04 d'Objective CAML pour Linux sur machine Intel :
# let
new_print_string
s
=
print_string
s;
String.length
s
;;
val new_print_string : string -> int = <fun>
# (+
)
(new_print_string
"Hello "
)
(new_print_string
"World!"
)
;;
World!Hello - : int = 12
L'affichage des deux chaînes montre que la deuxième chaîne s'affiche
avant la première.
Il en est de même avec les exceptions :
# try
(failwith
"fonction"
)
(failwith
"argument"
)
with
Failure
s
->
s;;
- : string = "argument"
Si l'on désire préciser l'ordre d'évaluation des arguments, il est
nécessaire d'effectuer des déclarations locales forçant cet ordre
avant l'appel de la fonction. L'exemple précédent peut alors se
réécrire ainsi :
# let
e1
=
(new_print_string
"Hello "
)
in
let
e2
=
(new_print_string
"World!"
)
in
(+
)
e1
e2
;;
Hello World!- : int = 12
En Objective CAML, l'ordre d'évaluation des arguments n'est pas
spécifié. En fait, à ce jour, toutes les mises en oeuvre d'Objective CAML
évaluent les arguments de droite à gauche. Néanmoins l'utilisation
de ce trait d'implantation peut se révéler dangereux pour de futures
versions du langage modifiant l'implantation.
On retrouve l'éternel débat sur la conception des
langages. Faut-il ne pas spécifier volontairement certains traits du
langage et demander aux programmeurs de ne pas s'en servir sous peine
de résultats différents de leur programme selon les mises en
oeuvre des compilateurs, ou faut-il tout spécifier et donc
autoriser les programmeurs à utiliser le langage dans son ensemble
quitte à compliquer la tâche de mise en oeuvre et interdire
certaines optimisations ?