Les macros
DescriptionMacro <nom> [(Parametre [, ...])] ... EndMacro
Le système de macro est une fonctionnalité très puissante, principalement utile pour les programmeurs chevronnés. Une macro est un bout de code quelconque (un mot clef, une ligne, plusieurs lignes) qui peut être inséré à n'importe quel endroit dans le code source en indiquant le nom de la macro. En ce sens, une macro est différente d'une procedure, car les procédures ne dupliquent pas leur code à chaque appel.
La déclaration Macro : EndMacro doit être effectuée avant le premier appel à la macro. Comme les macros seront complètement remplacées par le code correspondant au moment de la compilation, elles ne sont pas locales à une procédure.
Une macro ne peut pas avoir un type de retour, ou des paramètres typés, car cela n'a pas de sens. Quand une macro a des paramètres, ils sont remplacés dans le code de la macro par l'expression littérale qui a été passée lors de l'appel. Aucune évaluation n'est faite à ce stade, ce qui est très important à comprendre: l'évaluation de la ligne ne commence uniquement lorsque toutes les macros trouvées sur cette ligne ont été traitées.
Les macros sont divisées en deux catégories: les simples (sans paramètres) et les complexes (avec paramètres, obligation d'utiliser les parenthèses pour les appeler). Quand aucun paramètre n'est spécifié, il est possible de remplacer n'importe quel mot avec un autre mot (ou une autre expression). Les macros peuvent être utilisées de manière récursive, mais si un des paramètres passés contient le caractère de concaténation '#', il ne sera pas géré.Exemple: Macro simple
Macro MonNot Not EndMacro a = 0 If MonNot a ; Ici la ligne sera remplacée par : 'If Not a' Debug "Ok" EndIfEn utilisant les paramètres, il est possible de créer des macros très flexibles. Le caractère de concaténation '#' est disponible pour créer des nouveaux mots ou labels en combinant le code de la macro et l'expression passée en paramètre (les espaces ne sont pas acceptées entre chaque mots devant être concaténés). Il est aussi possible de définir des valeurs par défaut pour chaque paramètre, pour qu'ils puissent être omis lors de l'appel de la macro.Exemple: Macro avec paramètres
Macro BoiteDeMessageEnMajuscule(Titre, Corps) MessageRequester(Titre, UCase(Corps), 0) EndMacro Texte$ = "le Monde" BoiteDeMessageEnMajuscule("Salut", "-"+Texte$+"-") ; Ici la ligne sera remplacée comme ça : ; MessageRequester("Salut", UCase("-"+Texte$+"-"), 0)Exemple: Macro avec paramètre par défaut
Macro BoiteDeMessageEnMajuscule(Titre, Corps = "Ah, aucun corps spécifié") MessageRequester(Titre, UCase(Corps), 0) EndMacro BoiteDeMessageEnMajuscule("Salut") ; Ici la ligne sera remplacée comme ça : ; MessageRequester("Salut", UCase("Ah, aucun corps spécifié"), 0)Exemple: Macro et concaténation
Macro XCase(Type, Texte) ; renvoie le texte dans la casse du type spécifié Type#Case(Texte) ; Type U => MAJUSCULES EndMacro ; Type L => minuscules Debug XCase(U, "Salut") ; macro remplacée par UCase("Salut") Debug XCase(L, "Salut") ; macro remplacée par LCase("Salut")Exemple: Macro complexe sur plusieurs lignes
Macro Guillemet " EndMacro Macro Assertion(Expression) CompilerIf #PB_Compiler_Debugger ; active uniquement assertion lorsque le débogueur est actif If Expression Debug "Assertion (Ligne " + Str(#PB_Compiler_Line) + ") : " + Guillemet#Expression#Guillemet EndIf CompilerEndIf EndMacro Assertion(10 <> 10) ; N'affichera rien Assertion(10 <> 15) ; Devrait afficher l'assertion