“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 238 — #248
i
i
i
i
i
i
i
i
238
5
• La programmation avec état explicite
fun {NewStack}
C={NewCell nil}
proc {Push E} C:=E|@C end
fun {Pop} case @C of X|S1 then C:=S1 X end end
fun {IsEmpty} @C==nil end
in
proc {$ Msg}
case Msg of push(X) then {Push X}
[] pop( ?E) then E={Pop}
[] isEmpty( ?B) then B={IsEmpty} end
end
end
Cela s’appelle l’envoi procédural contrairement à la version précédente qui utilise
l’envoi par enregistrement. Avec l’envoi procédural, un objet S est appelée comme
{S push(X)}. Avec l’envoi par enregistrement, le même appel est écrit {S.push
X}. L’envoi procédural sera utilisé partout dans le chapitre 6.
La pile sécurisée non agrégée avec état
Il est possible de combiner l’emballage avec les cellules pour obtenir une version qui
est sécurisée, avec état et non agrégée. Ce style est peu utilisé dans la programmation
orientée objet, mais il mérite d’être plus largement connu. Il n’utilise pas la programmation d’ordre supérieur directement. Chaque opération a un argument pile au lieu de
deux pour la version déclarative :
declare
local Wrap Unwrap
{NewWrapper Wrap Unwrap}
fun {NewStack} {Wrap {NewCell nil}} end
proc {Push S E} C={Unwrap S} in C:=E|@C end
fun {Pop S} C={Unwrap S} in
case @C of X|S1 then C:=S1 X end end
fun {IsEmpty S} @{Unwrap S}==nil end
in
Stack=stack(new:NewStack push:Push
pop:Pop isEmpty:IsEmpty)
end
Dans cette version, NewStack n’a besoin que de Wrap et les autres routines n’ont
besoin que de Unwrap. Comme l’autre version déclarative non agrégée, nous regroupons les quatre opérations ensemble dans un module. Dans le système Mozart, certains
types utilisent cette forme d’abstraction, comme par exemple les dictionnaires [23].
Précédent

- 253/370

Suivant