GDL Macro Arguments
Le contenu d’une définition de macro peut référencer tous ses arguments formels, certains ou aucun de ses arguments formels, en particulier pour les définitions de macros de valeurs, où plusieurs définitions de macros de valeurs peuvent se produire au sein d’une construction *Macros avec une seule liste d’arguments formelle partagée par toutes les définitions. Dans ce cas, une définition peut référencer certains des arguments formels, tandis qu’une autre fait référence à aucun.
Si une définition de macro omet les références à un ou plusieurs arguments formels, la liste de paramètres fournie lorsque la macro est référencée peut indiquer les paramètres manquants par des virgules (,) qui ne séparent rien.
Par exemple, la référence de macro suivante utilise uniquement le cinquième argument. Les quatre premiers sont omis.
*Attribute: =Macro(,,,, =PassedInMacroRef)
Vous n’avez pas besoin d’indiquer les paramètres de fin omis. Si la macro de l’exemple précédent a déclaré 10 arguments formels mais référencé uniquement le cinquième argument, l’exemple précédent est toujours un moyen valide de référencer la macro.
Pour les macros de valeur, aucun espace blanc n’est autorisé entre la référence de macro et sa liste de paramètres. Cette syntaxe permet à l’analyseur de faire la distinction entre une référence de macro qui n’utilise aucun argument qui se trouve être suivi d’un élément qui ressemble à une liste de paramètres d’une référence de macro qui utilise une liste de paramètres.
Par exemple, considérez l’exemple de code suivant.
*Attrib: =Macro1 (=Macro2) *% is 2 separate macro references
while
*Attrib: =Macro1(=Macro2) *% you are passing Macro2 as a
*% parameter to Macro1.
Si les définitions de macro sont imbriquées, les arguments formels ne peuvent être utilisés que par le contenu de la macro qui a déclaré les arguments. Le contenu des définitions de macro imbriquées ne peut pas référencer les arguments définis par la macro englobante.
Les références de macro qui se produisent dans une définition de macro peuvent contenir des listes de paramètres qui nomment des macros qui elles-mêmes nécessitent des listes de paramètres. Toutefois, une liste de paramètres ne peut pas être fournie pour les références à des arguments formels. Par exemple, l’entrée suivante dans une définition de macro de bloc est acceptable.
*Attrib1: =Macro1(=Macro2(=Macro3(=Arg1, =Arg2)))
Dans l’exemple précédent, =MacroN représente une référence à une macro de valeur définie précédemment et =ArgN représente une référence à un argument formel.
Toutefois, l’exemple de code suivant n’est pas une entrée acceptable.
*Attrib2: =Arg1(=Arg2, =Arg3(=Macro1, =Macro2)) *% Not Valid !
Si une référence de macro correspond à un nom d’argument formel déclaré par la macro, vous pouvez supposer qu’il s’agit d’une référence à cet argument formel, qu’une macro réelle existe ou non avec ce nom. Vous pouvez éviter de telles ambiguïtés en utilisant un qualificateur d’espace de noms avec la référence de macro. Toutefois, vous ne pouvez pas utiliser de qualificateurs d’espace de noms avec des arguments formels.
Pour les macros de valeurs, si aucune liste d’arguments formels n’a été déclarée dans la construction *Macros, toute référence aux macros définies dans ne doit pas être suivie d’une liste de paramètres. Une telle liste ne sera pas considérée comme faisant partie de la référence de macro.
Par exemple, considérez si =Macro1 est défini par l’exemple de code suivant.
*Macros: NoArgList
{
Macro1: "a Value macro with no argument list"
Macro2: "a Value macro with no argument list"
Macro3: "a Value macro with no argument list"
}
Ensuite, la référence de macro suivante sera interprétée comme trois références de macro distinctes et non liées.
*attribute: =Macro1(=Macro2, =Macro3)
L’analyseur n’interprète pas (=Macro2, =Macro3) comme une liste de paramètres pour =Macro1. Ce comportement préserve la compatibilité descendante avec les GPD actuels.