Les instructions WITH et VIEWING
Les instructions WITH et VIEWING modifient respectivement les portées et les types des identificateurs.
Instruction WITH
L'instruction WITH offre une méthode abrégée pour faire référence aux champs d'enregistrement. La structure d'enregistrement est nommée une fois dans une instruction WITH. Par la suite, toutes les instructions dans le cadre de l'instruction WITH peuvent omettre le nom de la structure et le point, faisant référence aux champs d'enregistrement comme s'il s'agissait de simples variables. La forme de l'instruction WITH est la suivante :
with-statement = "with" record-var-list "do" statement . |
Exemple :
- CONST totemployees = 637;
- TYPE personnel = RECORD
- name: PACKED ARRAY [1..18] OF CHAR;
- empnumber,age:INTEGER;
- sex:(male,female);
- salary:REAL:
- vested:BOOLEAN
- END;
- VAR employee:ARRAY[1..totemployees] OF personnel:
- i: 1..totemployees:
- (* : *)
- WITH employee[i] DO BEGIN
- name := 'Jean Tremblay'
- empnumber := 211;
- age := 36:
- sex := male:
- salary := 18191.54;
- vested := TRUE
- END;
Les valeurs des variables dans la liste record-var-list sont déterminées lors de l'évaluation de la liste record-var-list, et les modifications dans le cadre de l'instruction WITH n'ont aucun effet sur ces valeurs. Par exemple, la variable d'indice i dans l'exemple précédent pourrait être augmentée d'un incrément dans l'instruction WITH, mais cela n'affecterait pas l'élément de tableau auquel on accède.
L'utilisation de l'instruction WITH pour plusieurs références aux mêmes variables produit normalement un code objet plus efficace.
Instruction VIEWING
L'instruction VIEWING permet d'échapper aux règles de typage strictes du Pascal standard. Dans l'intervalle affectée par l'instruction VIEWING, les variables visualisées prennent de nouveaux types. La forme de l'instruction VIEWING est la suivante :
viewing-statement = "viewing" id-list ":" type-id "do" statement |
Si l'instruction suivant le mot réservé DO est une instruction composée, elle est délimitée par les mots réservés BEGIN et END.
Un message d'erreur est émis au moment de la compilation dans les cas suivants :
- Un tableau conforme est apparu dans une liste d'identificateurs VIEWING.
- Le nouveau type de la variable est plus grand que l'ancien type. Pour les besoins de l'utilisation par VIEWING, les variables simples de types CHAR, BOOLEAN, INTEGER, I24, REAL et pointeur nécessitent un mot.
Exemple :
- TYPE iarr:ARRAY [1..10] OF INTEGER;
- rarr:ARRAY [1..11] OF REAL;
- rec1:RECORD
- a:INTEGER;
- c:rarr;
- END;
- rec2:RECORD
- d:rarr;
- e:INTEGER;
- END;
-
- VAR
- i,j,k:INTEGER;
- r,s,t:REAL;
- flag:BOOLEAN;
- ia:iarr;
- ir:rarr;
- r1:recl;
- r2:rec2;
- BEGIN
- VIEWING i,j,k REAL DO
- VIEWING flag REAL DO
- VIEWING ir REAL DO
- VIEWING r1 : REAL DO
- VIEWING r2 : REAL DO
- BEGIN
- i:=r;
- j:=s;
- k:=t;
- flag:=r*s/t;
- ia:=flag+1; (* Seulement le premier mot de ia est modifié *)
- ir:=k-1.0; (* Seulement le premier mot de ir est modifié *)
- r1:=k-1.0; (* Seulement le premier mot de r1 est modifié *)
- r2:=SQRT(i); (* Seulement le premier mot de r2 est modifié *)
- END;
- VIEWING r1 : rec2 DO r1 := r2; (* tous les 12 mots de r2 copiés dans r1 *)
- VIEWING ia : rarr DO ia := ir; (* erreur .. rarr est plus grand que iarr *)
- VIEWING ir : iarr DO ia := ir; (* ok.. iarr est plus petit que rarr,. seulement les 10 premiers mots sont copiés *)
- END;
L'instruction VIEWING est une extension CRI de la norme ISO niveau 1 Pascal.