RAW HTWL
 
Développement des macros dans RAW HTWL

sommaire général


RAW HTWL s'appuie sur un langage interprété, à la façon de TEX. Les expressions sont évaluées au fur et à mesure que le programme les rencontre.


1. Substitutions de textes

Exemple :

\def \date_mise_a_jour { 24 février 2000 }

ce site a été mis à jour le \date_mise_a_jour.

L'appel à la macro \date_mise_a_jour sera remplacé par la définition de la macro, c'est à dire ici par « 24 février 2000 ».
Au final cela donne : ce site a été mis à jour le 24 février 2000.

Autre exemple :

\def \mail #texte { <A HREF="mailto:andriana@mail.dotcom.fr"> #texte </A>

vous pouvez \mail { m'écrire } si vous le voulez.

L'appel à la macro \mail sera remplacé par la définition de la macro, c'est à dire ici par « <A HREF="mailto:andriana@mail.dotcom.fr"> #texte </A> », où l'argument #texte a préalablement été remplacé par « m'écrire ».
Au final cela donne : vous pouvez <A HREF="mailto:andriana@mail.dotcom.fr">m'&eacute;crire</A> si vous le voulez.


2. Définitions multiples

Lorsqu'on appelle une macro, RAW HTWL utilise la dernière définition en date correspondant au nom qu'on utilise. Voir aussi la notion de portée d'une macro.

Exemple :

\def \auteur { David A. }

\def \auteur { David Andriana }

ce site a été conçu par \auteur.

C'est la deuxième définition de \date_mise_a_jour (la définition la plus récente) qui sera utilisée.


3. Développements successifs

Quand une macro fait référence à une autre macro, RAW HTWL procède à des développements successifs :

\def \couleur { #FFC0A0 }

\def \mettre_en_couleur #texte
{
    <FONT COLOR="\couleur"> #texte </FONT>
}

ceci est \mettre_en_couleur { un } exemple.

est d'abord développé en :

ceci est <FONT COLOR="\couleur"> un </FONT> exemple.

puis en :

ceci est <FONT COLOR="#FFC0A0"> un </FONT> exemple.



Il n'y a pas de limite dans les développements successifs de macros emboîtées. D'ailleurs une macro peut très bien s'emboîter elle-même, comme le montre le concept de macro récursive. Cela rend possibles des développements successifs illimités. Attention quand même à prévoir une condition d'arrêt.


4. Définir une macro n'affiche rien

Quand on définit une macro avec \def, cela ne la développe en aucune façon. Ainsi, on peut inclure dans la définition des références à des objets qui n'existent pas encore, comme des appels à des macros qu'on ne définira que plus tard, ou encore des références à des fichiers qu'on créera plus tard avec \createfile ou \queuefile.

Exemple : référence à une macro qu'on ne définit qu'après

\def \mettre_en_couleur #texte
{
    <FONT COLOR="\couleur"> #texte </FONT>
}

\def \couleur { #FFC0A0 }

ceci est \mettre_en_couleur { un } exemple.

Cet exemple donnera exactement la même chose que l'exemple d'avant, car la macro \mettre_en_couleur n'est développée que lorsqu'on l'appelle, et non lorsqu'on la définit. Or dans cet exemple, on appelle bien \mettre_en_couleur après que la macro \couleur a été définie. Par suite, le développement de \mettre_en_couleur ne posera aucun problème.

En revanche, l'exemple suivant mène à une erreur :

\def \mettre_en_couleur #texte
{
    <FONT COLOR="\couleur"> #texte </FONT>
}

ceci est \mettre_en_couleur { un } exemple.

\def \couleur { #FFC0A0 }



5. Forcer un développement

La primitive \let permet de définir une macro sans argument qui contient le résultat du développement de sa définition :

\def \pinpon { PIN PON }

\def \multiplier_par_10 #x { #x #x #x #x #x #x #x #x #x #x }

\let \sirene
{
    \multiplier_par_10 { \pinpon }
}

Comme \let force le développement, la définition de la macro \sirene n'est pas ce qu'on lit ci-dessus, mais bien le développé « PIN PON PIN PON PIN PON PIN PON PIN PON PIN PON PIN PON PIN PON PIN PON PIN PON ».

\let est surtout utile pour calculer immédiatement des valeurs numériques avec \num.


6. Retarder un développement

Parfois on souhaite développer un argument avant la macro proprement dite. C'est le cas par exemple quand l'argument est contenu dans un fichier qu'on n'a pas encore chargé avec \include.

Exemple :

Imaginons que le fichier « description de scène.h » contienne les lignes suivantes :

{ scène 13 } { Le personnage entre dans la pièce (...) }


Si on essaie le code suivant,

\def \mise_en_page #titre #contenu
{
    <H1>#titre</H1>

    #contenu
}

\mise_en_page \include { mon fichier.h }

on aura en fait écrit quelque chose équivalent à ceci :

\mise_en_page { \include } { mon fichier.h }

Alors qu'on voulait avoir quelque chose équivalent à :

\mise_en_page { scène 13 } { Le personnage entre dans la pièce (...) }

Pour atteindre notre but il faudra modifier notre code HTWL, et utiliser \wait :

\def \mise_en_page #titre #contenu
{
    <H1>#titre</H1>

    #contenu
}

\mise_en_page \wait \include { mon fichier.h }

Cela exécute le côté droit (\include) avant le côté gauche (\mise_en_page), ce qui était en fait exactement ce qu'on voulait.


7. Passage des arguments

Voir les chapitres sur la définition et l'appel de macros.


8. Poursuivre la navigation

retour au sommaire général