Le sous-ensemble de Scheme enseigné est dit « purement fonctionnel »,
il s'apparente au monde merveilleux des mathématiques où les valeurs
ne changent pas et où ce qui est vrai reste vrai jusqu'à la fin des
temps (ces deux propriétés ne sont pas vraies dans la quasi-majorité
des langages de programmation). Du coup, puisque tout est composable
avec tout en Scheme (seules les définitions ne sont pas librement
composables pour des raisons de portée), il est possible d'énoncer des
« identités remarquables » comme celle-ci:
(if a (f b) (f g)) º (f (if a b g))
Dans les deux cas, on calcule la condition
a puis on applique
f sur la valeur de
b ou
g suivant la valeur de
vérité obtenue à partir de
a. L'identité obtenue permet de
mettre
f en facteur.
Inversement, on peut également écrire:
(if a (b d) (g d)) º ((if a b g) d)
Cette identité ne met pas en facteur la fonction mais son unique
argument. Notez qu'ici la transformation syntaxique, correspondant à
la factorisation, est de même nature que la précédente et conduit à
calculer la fonction (la valeur de
b ou
g) qui sera
appliquée à l'argument (la valeur de
d). Que la fonction à
invoquer soit le résultat d'une alternative plutôt que d'une variable
illustre bien la régularité du langage.