“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 236 — #246
i
i
i
i
i
i
i
i
236
5
• La programmation avec état explicite
La pile sécurisée déclarative non agrégée
Sécurisons cette version avec une paire emballeur/déballeur, comme nous l’avons vu
dans la section 3.5 :
declare
local Wrap Unwrap
{NewWrapper Wrap Unwrap}
fun {NewStack} {Wrap nil} end
fun {Push S E} {Wrap E|{Unwrap S}} end
fun {Pop S ?E}
case {Unwrap S} of X|S1 then E=X {Wrap S1} end end
fun {IsEmpty S} {Unwrap S}==nil end
in
Stack=stack(new:NewStack push:Push
pop:Pop isEmpty:IsEmpty)
end
Cette version est sécurisée, déclarative et non agrégée. La pile est déballée quand on
commence une opération ADT et de nouveau emballée quand l’opération se termine.
À l’extérieur de l’ADT, la pile est toujours emballée.
La pile sécurisée déclarative agrégée
Faisons une version agrégée de la pile déclarative. L’idée est de cacher la pile à
l’intérieur des opérations, pour qu’elle ne puisse pas en être séparée. Voici comment
la programmer :
local
fun {StackObject S}
fun {Push E} {StackObject E|S} end
fun {Pop ?E} case S of X|S1 then
E=X {StackObject S1} end end
fun {IsEmpty} S==nil end
in stack(push:Push pop:Pop isEmpty:IsEmpty) end
in
fun {NewStack} {StackObject nil} end
end
Cette version est sécurisée, déclarative et agrégée. Elle démontre le fait remarquable
que pour sécuriser une abstraction de données il ne faut ni l’état explicite ni des noms.
On peut le faire avec seulement la programmation d’ordre supérieur. La fonction
StackObject prend une liste S et renvoie l’enregistrement des valeurs procédurales
stack(push:Push pop:Pop isEmpty:IsEmpty), dans lequel S est cachée
i
i
i
i
i
i
i
i
236
5
• La programmation avec état explicite
La pile sécurisée déclarative non agrégée
Sécurisons cette version avec une paire emballeur/déballeur, comme nous l’avons vu
dans la section 3.5 :
declare
local Wrap Unwrap
{NewWrapper Wrap Unwrap}
fun {NewStack} {Wrap nil} end
fun {Push S E} {Wrap E|{Unwrap S}} end
fun {Pop S ?E}
case {Unwrap S} of X|S1 then E=X {Wrap S1} end end
fun {IsEmpty S} {Unwrap S}==nil end
in
Stack=stack(new:NewStack push:Push
pop:Pop isEmpty:IsEmpty)
end
Cette version est sécurisée, déclarative et non agrégée. La pile est déballée quand on
commence une opération ADT et de nouveau emballée quand l’opération se termine.
À l’extérieur de l’ADT, la pile est toujours emballée.
La pile sécurisée déclarative agrégée
Faisons une version agrégée de la pile déclarative. L’idée est de cacher la pile à
l’intérieur des opérations, pour qu’elle ne puisse pas en être séparée. Voici comment
la programmer :
local
fun {StackObject S}
fun {Push E} {StackObject E|S} end
fun {Pop ?E} case S of X|S1 then
E=X {StackObject S1} end end
fun {IsEmpty} S==nil end
in stack(push:Push pop:Pop isEmpty:IsEmpty) end
in
fun {NewStack} {StackObject nil} end
end
Cette version est sécurisée, déclarative et agrégée. Elle démontre le fait remarquable
que pour sécuriser une abstraction de données il ne faut ni l’état explicite ni des noms.
On peut le faire avec seulement la programmation d’ordre supérieur. La fonction
StackObject prend une liste S et renvoie l’enregistrement des valeurs procédurales
stack(push:Push pop:Pop isEmpty:IsEmpty), dans lequel S est cachée
