bonjour !
Je voudrais revenir sur le bug de la macro présentée par Graph100. Ce n'est pas un bug, mais pb m'en apprend tout les jours !!!
Vous savez sûrement que tout langage informatique modulaire utilise la structure xml pour déterminer l'organisation du code, et pour pouvoir le fragmenter en blocs cohérents et classé afin que le linker qui lira le bytecode généré par les modules de compilations précédents puisse structurer le fichier exécutable selon la norme décrite par le format "PE".
Nos codes se composent d'une branche principals, appelant des procédures qui sont évaluées puis compilées avant cette branche.
Ces procédures possèdent des instructions de bases appelées également instructions natives du langages, ces instructions faisant appels à des variables ou constantes qui pourraient constituer le plus petit maillon de la chaîne ou le dernier noeud d'une branche.
Il en va de même pour les symboles ou expressions de pb.
Ainsi le code :
Code : Tout sélectionner
;du commentaire : messagerequester ("hello world !","bonjour à tous",0)
ne sera pas exécuté. Et pourtant, il y a un deux point ! Mais ces deux points sont ignoré car la priorité du point virgule est plus forte que celle des deux points.
alors que :
Code : Tout sélectionner
;du commentaire
MessageRequester ("hello world !","bonjour à tous",0)
est exécuté.
Ce qui signifie que pb fait la différence entre le symbol deux points qui sépare deux instruction et le retour à la ligne qui marque la fin d'un bloc d'instructions.
Il en va de même pour les macros. En réalité, chaque mot de notre langage possède un niveau de priorité permettant à l'analyseur syntaxique de pb de structurer notre programme en arbre.
Pour aller plus loin : vous savez également que toutes les instructions conditionnelles se basent sur l'instruction "if" qui s'appuie sur des booléans pour valider la condition.
Du coup, lorsque le compilateur rencontre un symbol de fin de ligne il doit mettre à true une variable indiquant la fin de bloc d'instructions, et ajouter un noeud dans l'arbre xml.
Même si dans la macro présentée par Graph100 le bloc if ... endif... permet de délimiter la fin d'un bloc d'instructions, le code de la "macro" qui lui, sera évaluer qu'après analyse syntaxique de toute la ligne, remet à "false" cette variable puisque le "endif" est dans cette macro. Les instructions qui suivent (en l'occurance l'instruction With",
en l'abscence de retour à la ligne se retrouve donc dans la même branche que la macro. Et pb ne pouvant pas créer une priorité d'exécution émet un message d'erreur.