Author: Christian.Queinnec@lip6.fr

## 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 ?