L'erreur dans le résultat de la seconde phrase est due à une
implémentation fausse de la primitive not (qui se
comportait en fait comme l'identité).
Cela n'explique cependant pas pourquoi la première phrase est évaluée
correctement. La raison en est que le compilateur effectue les
transformations suivantes sur le code qui lui est soumis:
if not cond then e1 else e2 devient
if cond then e2 else e1
if true then e1 else e2 devient
e1
if false then e1 else e2 devient
e2
2, ce qui
est correct, et élimine complètement l'appel à la primitive
not.
En revanche la seconde phrase obligeait le compilateur à compiler une
application de not, ce qui mettait en évidence le code
faux de not. Le compilateur aurait aussi pu réduire
l'expression not true en false, ce qui
aurait aussi masqué l'erreur poour la seconde phrase! (Dans Caml V3.0,
cette optimisation avait été jugée inutile car not true
n'apparaît pratiquement jamais directement dans les programmes source.)
Le plus intéressant dans l'histoire c'est que le compilateur était capable
de se recompiler sans erreur: les occurrences de not,
employé en tant que fonction, sont très rares; en tout cas aucune
n'apparaissait dans le compilateur lui-même.
Contacter l'auteur Pierre.Weis@inria.fr