“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 118 — #128
i
i
i
i
i
i
i
i
118
3
• Techniques de programmation déclarative
fun {Sqrt X}
fun {Improve Guess}
(Guess + X/Guess) / 2.0
end
fun {GoodEnough Guess}
{Abs X-Guess * Guess}/X < 0.00001
end
fun {SqrtIter Guess}
if {GoodEnough Guess} then Guess
else {SqrtIter {Improve Guess}} end
end
Guess=1.0
in {SqrtIter Guess} end
Figure 3.8 Trouver les racines avec la méthode de Newton (cinquième version).
3.2.4 Du schéma général vers une abstraction de contrôle
Le schéma général de la section 3.2.1 aide le programmeur à concevoir des programmes efficaces, mais il n’existe que dans l’esprit du programmeur. Nous pouvons
aller plus loin en programmant le schéma général comme un composant qui peut être
utilisé par d’autres composants. Nous disons que le schéma devient une abstraction de
contrôle : une abstraction qui assure l’ordre désiré des opérations. Voici sa définition :
fun {Iterate S i }
if {IsDone S i } then S i
else S i+1 in
S i+1 ={Transform S i }
{Iterate S i+1 }
end
end
Ce schéma réalise une boucle while qui calcule un résultat. Pour convertir le schéma
en une abstraction de contrôle, nous devons le paramétriser en extrayant les parties
qui varient d’une utilisation à une autre. Il y a deux parties : les fonctions IsDone et
Transform. Nous en faisons deux paramètres de Iterate :
i
i
i
i
i
i
i
i
118
3
• Techniques de programmation déclarative
fun {Sqrt X}
fun {Improve Guess}
(Guess + X/Guess) / 2.0
end
fun {GoodEnough Guess}
{Abs X-Guess * Guess}/X < 0.00001
end
fun {SqrtIter Guess}
if {GoodEnough Guess} then Guess
else {SqrtIter {Improve Guess}} end
end
Guess=1.0
in {SqrtIter Guess} end
Figure 3.8 Trouver les racines avec la méthode de Newton (cinquième version).
3.2.4 Du schéma général vers une abstraction de contrôle
Le schéma général de la section 3.2.1 aide le programmeur à concevoir des programmes efficaces, mais il n’existe que dans l’esprit du programmeur. Nous pouvons
aller plus loin en programmant le schéma général comme un composant qui peut être
utilisé par d’autres composants. Nous disons que le schéma devient une abstraction de
contrôle : une abstraction qui assure l’ordre désiré des opérations. Voici sa définition :
fun {Iterate S i }
if {IsDone S i } then S i
else S i+1 in
S i+1 ={Transform S i }
{Iterate S i+1 }
end
end
Ce schéma réalise une boucle while qui calcule un résultat. Pour convertir le schéma
en une abstraction de contrôle, nous devons le paramétriser en extrayant les parties
qui varient d’une utilisation à une autre. Il y a deux parties : les fonctions IsDone et
Transform. Nous en faisons deux paramètres de Iterate :
