retour au sommaire général On appelle macro récursive une macro qui fait référence à elle-même dans sa définition. Ce genre de macro ne peut être défini qu'avec \def, jamais avec \let. 1. Risques La définition de macro suivante est très dangereuse, puisque son développement fait appel à elle-même, donc si on l'appelait une fois, elle s'appellerait une autre fois, puis une autre, et ainsi de suite. Cela provoquerait une saturation de la mémoire, et un plantage de RAW HTWL, voire du Mac.
2. Conditions d'arrêt Pour arrêter à un moment ou un autre le développement d'une macro récursive, il faut employer un test, dit condition d'arrêt :
Quand on l'appelle, cette macro \compte_a_rebours se lance une première fois : comme \compteur est supérieur à zéro, elle affiche « TOP \compteur », c'est-à-dire « TOP 8 », décrémente le compteur, et s'appelle elle-même. Lors de ce deuxième appel, comme \compteur est encore supérieur à zéro, elle affiche « TOP \compteur », c'est-à-dire cette fois-ci « TOP 7 », décrémente le compteur, et s'appelle de nouveau elle-même. Au fur et à mesure de ses développements imbriqués, la macro affiche « TOP 6 », puis « TOP 5 », « TOP 4 », « TOP 3 », « TOP 2 », puis s'appelle de nouveau après avoir fait baisser le compteur. Cette fois, quand elle s'exécute, le compteur est à < 1 >. Il est supérieur à zéro, donc elle affiche « TOP 1 », puis décrémente le compteur et s'appelle elle-même. Lors de ce nouvel appel, elle s'aperçoit que le compteur est égal à zéro. Elle affiche donc « FIN » et ne s'appelle plus ! Le développement est alors terminé. 3. Récursivité et arguments Dans l'exemple précédent, on s'appuyait sur une variable \compteur externe à la macro. Voyons maintenant un compte à rebours codé sans variable externe :
On passe en argument le début du compte à rebours. 4. Nombre d'arguments illimité Tout comme TEX, RAW HTWL permet grâce à des astuces, de passer aux macros un nombre illimité d'arguments. Cela est utile quand on veut coder une table ou une liste dont le nombre d'éléments pourra varier au cours de l'évolution du site. On utilise pour cela des arguments avec séparateurs :
On voit que l'arrêt se décide sur le fait que l'argument passé est vide ou non. Cette macro s'utilise ainsi :
On termine bien l'appel à la macro par un argument vide. Se reporter aussi à la présentation de \ifvoid, et aux exemples. 5. Poursuivre la navigation retour au sommaire général
|