Partager via


Macros de valeur GDL

Les macros de valeur sont utilisées pour représenter tout ou partie d’une valeur. Elles sont définies dans la construction *Macros. Vous pouvez définir plusieurs macros au sein d’une même construction.

Chaque entrée dans la construction *Macros est une macro distincte. La mot clé de l’entrée devient le nom de la macro de valeur, et la valeur de l’entrée devient le contenu de cette macro de valeur. Le nom de la macro doit être un type de nom de symbole. Le contenu d’une macro de valeur peut être tout ce qui respecte la syntaxe GDL valide pour une valeur.

Les macros de valeur peuvent référencer d’autres macros de valeur. Le nom instance de la construction *Macros peut contenir une balise suivie d’une liste d’arguments formels entre parenthèses. Toute référence à n’importe quel argument formel par l’une des définitions de macro dans la construction *Macros est symboliquement remplacée par le paramètre correspondant qui est passé lorsque la macro de valeur est effectivement référencée.

Note Les déclarations et les références des arguments qui seront utilisées pour passer des références de macro de valeur sont précédées du signe égal (=) pour indiquer que le type d’argument est une macro de valeur. Toutes les références aux macros de valeur sont également précédées du signe égal (=) pour indiquer que la référence est à une macro de valeur au lieu d’une macro de bloc. Le signe égal doit être immédiatement suivi du nom de la macro de valeur, et aucun espace blanc n’est autorisé. Les références aux macros de valeur peuvent imbriquer des listes de paramètres à une profondeur arbitraire.

Exemples de macros

Toutes les définitions de macro de valeur doivent être reconnues comme une entité de valeur complète et valide.

L’exemple de code suivant montre comment utiliser des macros de valeur.

*Macros:
{
    InvalidMacro: "First Half of a string
}

InvalidMacro n’est pas valide, car le contexte de chaîne entre guillemets doit être terminé par un guillemet double. Cette chaîne indéterminée n’est pas une valeur complète.

Si vous souhaitez représenter une entité de valeur incomplète, utilisez l’exemple de code suivant.

*Macros:
{
    FirstHalf: <BeginValue:Q>"This is the first half <EndValue:Q>
    SecondHalf:  <BeginValue:Q>of the string."<EndValue:Q>
}
*FullString: =FirstHalf=SecondHalf
*%  *FullString now expands to generate the complete string:
*FullString: "This is the first half of the string."

Le code suivant montre comment utiliser des arguments de macro.

*Macros: FormalArgs(=arg1, =arg2)
{
result1: disappointed
result2: pleased
result3: impressed
result4: awestruck
result5: restrained


adverb1: very =arg1 and =arg2
   adverb2: while remaining =arg1
   String1:  The audience was =arg1 with today's performance.
}

Le code suivant montre comment utiliser des références de macro avec des paramètres.

*BadOutput: =String1(=result1)
*GoodOutput: =String1(=adverb1(=adverb1(=result2, =result3), =adverb2(=result5)))

L’analyseur développe les références de macro précédentes pour produire le code suivant.

*BadOutput: The audience was disappointed with today's performance.
*GoodOutput: The audience was very, very pleased and impressed and while remaining restrained with today's performance.

Les références de macro de valeur ne sont pas reconnues dans tous les contextes de valeur. Par exemple, les macros de valeur ne sont pas reconnues dans les contextes de valeur ou de chaîne entre guillemets arbitraires. Toutefois, les macros de valeur sont reconnues dans des contextes de chaîne hexadécimale qui peuvent résider dans le contexte de chaîne entre guillemets.

Pour assurer la compatibilité descendante avec gpD, le signe de pourcentage (%) est interprété comme signifiant qu’il introduit un contexte de paramètre de commande lorsque le signe de pourcentage est utilisé dans un contexte de valeur d’espace non littéral dans le contenu d’une définition de macro de valeur. En d’autres termes, évitez d’utiliser le signe de pourcentage dans une définition de macro value, sauf si vous définissez un paramètre de commande ou si le signe de pourcentage est contenu dans un contexte d’espace blanc littéral, tel que <Begin/EndValue>.

Le contenu d’une définition de macro n’est réellement interprété que lorsque la macro est référencée en dehors de toute définition de macro. À ce moment-là, la macro référencée est remplacée par son contenu, et le contenu est en fait interprété. Si le contenu contient une référence de macro, cette référence est remplacée par son contenu et l’interprétation continue avec le contenu de cette macro.

Vous devez considérer l’analyseur comme agissant sur un seul flux d’entrée. Lorsqu’une référence de macro est détectée en dehors d’une définition de macro, la référence de macro est supprimée du flux d’entrée et remplacée par son contenu, et l’analyse du flux d’entrée se poursuit avec le contenu de la macro.

Considérez la macro suivante.

*Macros:
{
quote: <BeginValue:x>"<EndValue:x>
first_half: =quote This is enclosed
second_half:  by quotes.=quote
whole_string: =first_half <not a hex string!> =second_half
}
*Print1: =quote
*Print2: =first_half
*Print3: =second_half
*Print4: =whole_string

La macro précédente est étendue au code suivant.

*Print1:  "
*Print2:  " This is enclosed
*Print3:  by quotes."
*Print4:  " This is enclosed <not a hex string!> by quotes."

Notez que le résultat développé n’est pas syntaxiquement un GDL juridique.