logo

Macro : Résolution de macro-variables

Bonjour.

J’ai des problèmes avec le fonctionnement des macro-variables. Par exemple, si on a :
%let mvn = 1 ;
%let mvtab = total ;
%let mvtab1 = mois ;

&&mvtab&mvn -> &mvtab1 soit mois, là je comprends.

Mais :
&&&mvtab&mvn -> &&mvtab1 -> &mois dans mon esprit, mais non !

Pouvez-vous m’expliquer ?

 

Il y a 5 règles pour la transformation d’une chaîne de caractères contenant des &. Ce sont :

1) &mv1 ==> valeur de la macro-variable MV1
2) &mv1. ==> valeur de la macro-variable MV1
3) texte ==> le même texte à l’identique
4) && ==> &&
5) l’expression est lue de gauche à droite, en remplaçant chacun des 4 motifs ci-dessus au fur et à mesure qu’ils sont rencontrés. Si, après une première série de transformations, il reste des &, l’expression sera lue à nouveau, de gauche à droite.

En pratique, dans vos exemples…

&&mvtab&mvn est décomposé ainsi :

&& ==> & avec la règle 4
mvtab ==> mvtab avec la règle 3 (les & qui précèdent ont déjà été traités, donc MVTAB est du texte)
&mvn ==> 1 avec la règle 1

Il reste des &, donc deuxième lecture du résultat (règle 5) :

&mvtab1 ==> mois et c’est OK (règle 1 à nouveau).

> &&&mvtab&mvn

– les && deviennent un seul & pour la suite ;
– vient ensuite &mvtab qui devient total ;
– vient ensuite &mvn qui devient 1 ;
– reste avec &total1 et donc, règle 5, on y revient. Si la macro-variable TOTAL1 existe, c’est bon, parce qu’on récupère sa valeur. Sinon, on aura &TOTAL1 comme résultat, plus un message dans la Log « Apparent symbolic reference TOTAL1 not resolved » (comprendre : « qu’est-ce que c’est que cette macro-variable TOTAL1 dont personne ne m’a prévenu qu’elle existait ?! »).