“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 13 — #23
i
i
i
i
i
i
i
i
1.8 La programmation d’ordre supérieur
13
1.8 LA PROGRAMMATION D’ORDRE SUPÉRIEUR
Nous avons défini une fonction efficace, FastPascal, qui calcule les rangées du
triangle de Pascal. Maintenant nous voudrions faire des expériences avec des variations
du triangle. Par exemple, au lieu d’additionner des nombres pour calculer une rangée,
nous voudrions les soustraire, faire un « Ou exclusif » (pour voir s’ils sont pairs
ou impairs) et ainsi de suite. Une approche est de définir une nouvelle version de
FastPascal pour chaque variation. Mais cela devient vite exaspérant. Est-il possible
d’avoir une version qui permette de réaliser toutes les variations ? C’est possible en
effet. On l’appellera GenericPascal. Elle a un argument de plus par rapport à
FastPascal : une fonction qui définit comment calculer les rangées (addition,
Ou exclusif, etc.). La capacité de passer une fonction dans un argument s’appelle la
programmation d’ordre supérieur.
Voici la définition de GenericPascal avec son argument supplémentaire Op :
declare GenericPascal OpList
fun {GenericPascal Op N}
if N==1 then [1] else L in
L={GenericPascal Op N-1}
{OpList Op {ShiftLeft L} {ShiftRight L}}
end
end
C’est comme FastPascal sauf que nous avons remplacé AddList par OpList.
L’argument Op est passé à OpList. Comme ShiftLeft et ShiftRight ne
doivent pas connaître Op, on peut garder les anciennes versions. Voici la définition de
OpList :
fun {OpList Op L1 L2}
case L1 of H1|T1 then
case L2 of H2|T2 then
{Op H1 H2}|{OpList Op T1 T2} end
else nil end
end
Au lieu de faire l’addition H1+H2, cette version fait {Op H1 H2}.
Des variations sur le triangle de Pascal
Définissons quelques fonctions pour essayer GenericPascal. Pour obtenir le triangle original, il suffit de définir une addition :
declare
fun {Add X Y} X+Y end
© Dunod – La photocopie non autorisée est un délit
i
i
i
i
i
i
i
i
1.8 La programmation d’ordre supérieur
13
1.8 LA PROGRAMMATION D’ORDRE SUPÉRIEUR
Nous avons défini une fonction efficace, FastPascal, qui calcule les rangées du
triangle de Pascal. Maintenant nous voudrions faire des expériences avec des variations
du triangle. Par exemple, au lieu d’additionner des nombres pour calculer une rangée,
nous voudrions les soustraire, faire un « Ou exclusif » (pour voir s’ils sont pairs
ou impairs) et ainsi de suite. Une approche est de définir une nouvelle version de
FastPascal pour chaque variation. Mais cela devient vite exaspérant. Est-il possible
d’avoir une version qui permette de réaliser toutes les variations ? C’est possible en
effet. On l’appellera GenericPascal. Elle a un argument de plus par rapport à
FastPascal : une fonction qui définit comment calculer les rangées (addition,
Ou exclusif, etc.). La capacité de passer une fonction dans un argument s’appelle la
programmation d’ordre supérieur.
Voici la définition de GenericPascal avec son argument supplémentaire Op :
declare GenericPascal OpList
fun {GenericPascal Op N}
if N==1 then [1] else L in
L={GenericPascal Op N-1}
{OpList Op {ShiftLeft L} {ShiftRight L}}
end
end
C’est comme FastPascal sauf que nous avons remplacé AddList par OpList.
L’argument Op est passé à OpList. Comme ShiftLeft et ShiftRight ne
doivent pas connaître Op, on peut garder les anciennes versions. Voici la définition de
OpList :
fun {OpList Op L1 L2}
case L1 of H1|T1 then
case L2 of H2|T2 then
{Op H1 H2}|{OpList Op T1 T2} end
else nil end
end
Au lieu de faire l’addition H1+H2, cette version fait {Op H1 H2}.
Des variations sur le triangle de Pascal
Définissons quelques fonctions pour essayer GenericPascal. Pour obtenir le triangle original, il suffit de définir une addition :
declare
fun {Add X Y} X+Y end
© Dunod – La photocopie non autorisée est un délit
