On a défini :
fic (fichier) et tab (tableau) ;ctx1 et ctx2 ;Lire, Ecrire et Rechercher.Il s'agit maintenant de réutiliser ces modèles dans deux nouvelles situations [3] et [4]. Les procédures Lire_Objet et Ecrire_Objet étant suffisamment simples, on peut réutiliser les schémas Lire et Ecrire dans les cas [3] et [4]. On passe donc tout de suite au cas de la procédure Rechercher_Objet, modélisée par le texte Rechercher.
3. Remarque
Le texte attendu est le suivant :
140 M=0
145 IF M=LM4 GOTO 147
M=M+1
H=RG4(M)
SEARCH=4,H:Y4
IF Y4C1<X4C1 GOTO 145
IF Y4C1>X4C1 GOTO 148
IF Y4C2<X4C2 GOTO 145
IF Y4C2>X4C2 GOTO 148
IF Y4C3<X4C3 GOTO 145
IF Y4C3>X4C3 GOTO 148
MEN=0
RETURN
147 M=M+1
148 MEN=1
RETURN
Ce dernier cas reprend dans son principe les idées du précédent. La différence est qu'il faut ici répéter trois fois le test, qui n'apparaît qu'une fois dans le modèle initial.
Construction du contexte
Le contexte ctx4 reflète l'idée d'un test triple :
(def ctx4
((def NOM () ("4"))
(def RANG ...)
(def OBJ
((def val
((def test1 () ("X4C1"))
(def test2 () ("X4C2"))
(def test3 () ("X4C3")))
("X4"))
(def aux
...)
))))
chaque valeur d'OBJ a maintenant trois propriétés de test : test1, test2 et test3.
Utilisation de la recherche
On extrait du schema de Rechercher la partie de test, qu'on appelle proc-test :
(def Rechercher
((def schema
((def fin ...))
("...
{proc-test}
..."))
(def proc-test ()
("IF {test-aux}<{test-val} GOTO 145
IF {test-aux}>{test-val} GOTO 148
{suite}"))
(def test-val () ("{test((val((OBJ))))}"))
(def test-aux () ("{test((aux((OBJ))))}"))
(def suite () ())
...))
Le test proc-test est paramétré par test-val, test-aux et suite, dont on donne une valeur par défaut qui correspond à celle qu'on avait initialement – en particulier la suite est vide : on n'attend pas, dans proc-test, d'autres instructions derrière les deux conditions.
Dans le contexte ctx4, on utilise alors la recherche :
(schema
((ctx4)
(def test-val () ("{test1((val((OBJ))))}"))
(def test-aux () ("{test1((aux((OBJ))))}"))
(def suite ()
("{proc-test
((def test-val () ("{test2((val((OBJ))))}"))
(def test-aux () ("{test2((aux((OBJ))))}"))
(def suite ()
("{proc-test
((def test-val () ("{test3((val((OBJ))))}"))
(def test-aux () ("{test3((aux((OBJ))))}"))
(def suite () ())))}")))}"))
(Rechercher)))