> Tech > Définitions et expansions de macros

Définitions et expansions de macros

Tech - Par iTPro - Publié le 24 juin 2010
email

Une macro est un morceau de code avec un nom (les noms de macros m4 distinguent les majuscules/minuscules), des paramètres facultatifs, et une chaîne de texte associée qui constitue la définition de la macro. L’exemple suivant définit la macro SqlSaveState, qui n’a pas de paramètres, et une définition d’instruction d’assignation

Définitions et expansions de macros

SPL :

define(SqlSaveState, Set PrvStmtSqlState = SqlState)

Quand m4 rencontre la ligne d’entrée

SqlSaveState;

il remplace le nom de la macro par le texte de la définition pour produire la ligne de sortie

Set PrvStmtSqlState = SqlState;

On voit tout de suite que les macros simples offrent un « raccourci » pour des fragments de code fréquemment utilisés. Le texte de définition d’une macro peut être constitué de plusieurs lignes de code et il peut inclure d’autres macros, que nous verrons plus loin.

Les paramètres de macros permettent de réutiliser des morceaux de code qui varient légèrement selon l’usage. La macro suivante a un paramètre qui fournit le nom d’une variable SPL à tester :

define(SqlStateIsOk, ($1 = ‘00000’))

Quand m4 rencontre la ligne d’entrée

Is SqlStateIsOk(PrvStmtSqlState) Then

il remplace le nom de la macro et son argument par un texte étendu pour produire la ligne de sortie

If (PrvStmtState = ‘00000’) Then

Les macros de m4 peuvent avoir jusqu’à neuf paramètres, référencés dans le texte de remplacement de $1 à $9. m4 possède également plusieurs structures de genre paramètre intégrées, y compris $#, qui est remplacé par le nombre d’arguments fournis sur l’appel de macro. Vous pouvez traiter les paramètres facultatifs en testant $#.

Le texte de remplacement d’une macro peut contenir d’autres macros définies par l’utilisateur, intégrées, ce qui accroît grandement la puissance de m4, au prix, il est vrai, d’un peu plus de complexité.

La figure 1A montre les définitions de deux macros (les <<…>> sont des délimiteurs guillemets) : SqlApp Signal, qui s’étend en deux instructions SPL (Set et Signal) et SqlStd WarningWrapup, qui s’étend en une clause SPL When qui exécute conditionnellement le code défini dans la macro SqlAppSignal. Quand m4 rencontre l’entrée de la figure 1B, il produit la sortie de la figure 1C. Les appels de macros ne sont pas la même chose que les appels de procédures à l’exécution.

Lorsqu’il scrute le flux d’entrée, m4 recherche constamment des chaînes correspondant au nom d’une macro (ou de quelque structure intégrée). Dès que m4 rencontre une macro, il remplace le nom de celle-ci et toute éventuelle liste d’arguments par le texte de définition de la macro, allant jusqu’à remplacer les éventuelles références de paramètres $n par les chaînes correspondantes fournies comme arguments sur l’appel de macro. Lorsqu’il collecte les arguments d’une macro, m4 examine les chaînes d’arguments sans guillemets pour voir si elles contiennent des macros et, s’il en rencontre, il les étend immédiatement. Après il rescrute l’appel de macro.

Si d’autres macros sont rencontrées alors, le cycle se répète. Quand l’appel de macro ne contient plus de macros non étendues, la macro originale est étendue conformément à son texte de définition. Pour des macros simples, le résultat de leur imbrication est simple et direct. Mais sachez que certains résultats pourront sembler surprenants quand vous commencerez à travailler avec du traitement conditionnel, des chaînes entre guillemets et autres fonctions m4 (voir l’encadré « Les mystères des macros »).

Téléchargez gratuitement cette ressource

Aborder la Blockchain, comprendre et démarrer

Aborder la Blockchain, comprendre et démarrer

Une véritable révolution se prépare progressivement... les entreprises doivent veiller à ne pas rester à l’écart et se faire prendre de vitesse. Tout comme la mobilité ou encore le cloud, la blockchain est une composante essentielle de la transformation numérique. Découvrez, dans ce dossier, comment aborder, comprendre et démarrer la Blockchain

Tech - Par iTPro - Publié le 24 juin 2010