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=LM3(X3NB-64)
145 IF M=LM3(X3NB-63) GOTO 147
M=M+1
H=RG3(M)
SEARCH=3,H:Y1
IF Y3C<X3C GOTO 145
IF Y3C>X3C GOTO 148
MEN=0
RETURN
147 M=M+1
148 MEN=1
RETURN
Le troisième cas ressemble beaucoup au premier : la différence est qu'une recherche ne nécessite plus le balayage du fichier à partir de son origine et jusqu'à sa fin (entre "0" et "{borne((RANG))}"), mais un balayage plus fin entre deux valeurs du tableau des bornes LM3.
On dégage donc deux nouveaux concepts, qui n'apparaissaient pas dans les deux cas précédents : il s'agit des paramètres CLE-ORIGINE et CLE-MAX. Le schéma de recherche devient alors :
(def schema
((def fin ...))
("140 {CLE}={CLE-ORIGINE}
145 IF {CLE}={CLE-MAX} GOTO 147
..."))
Sachant que pour les contextes ctx1 et ctx2 ces deux paramètres n'ont pas été identifiés, on fournit une valeur d'instanciation par défaut dans l'environnement de Rechercher :
(def Rechercher
((def schema ...)
(def CLE-ORIGINE () ("0"))
(def CLE-MAX () ("{borne((RANG))}"))
(def CLE () ("M"))
))
c'est-à-dire qu'on ne modifie pas les contextes déjà construits ctx1 et ctx2 – et dans ces deux cas l'évaluation est inchangée.
Construction du contexte
On doit construire pour [3] un contexte légèrement différent :
(def ctx3
((def NOM () ("3"))
(def RANG
((def borne () ("LM3({CLE-LOG})"))
...))
(def OBJ
((def val
((def cle () ("X3NB"))
(def test () ("X3C")))
("X3"))
(def aux
...)
))))
Les modifications sont les suivantes :
borne du RANG de ctx3 est paramétrée par un texte CLE-LOG ;OBJ de ctx3 présentent une nouvelle propriété : cle, qui est la clé relative à l'objet par laquelle on accèdera à la borne.Utilisation de la recherche
A l'utilisation, on surcharge les définitions de CLE-ORIGINE et CLE-MAX :
(schema
((ctx3)
(def CLE-ORIGINE ()
("{borne
((def CLE-LOG () ({cle((val((OBJ))))}-64)))}"))
(def CLE-MAX ()
("{borne
((def CLE-LOG () ({cle((val((OBJ))))}-63)))}"))
(Rechercher)))
qui se lit :
ctx3 ;CLE-ORGINE et CLE-MAX, qui prennent en compte les spécificités du cas [3] ;Rechercher, pour lequel les paramètres instanciés par défaut reçoivent ici une valeur particulière.Remarque :
On utilise ici une propriété bien particulière de l'évaluateur, qui est de réaliser la recherche d'une définition de texte dans l'ordre des déclarations : en cas de redéfinition, on a la garantie que c'est la première définition qui est choisie.