Recursieve lussen

De recursieve lussen bieden een krachtige functionaliteit bij het weergeven van de hierarchische structuur van een SPIP site. Hun schijfwijze is bondig, maar hun toepassing vereist een goed begrip van de logica van het ineenschakelen van lussen.

Om een recursieve lus te maken, volstaat het om in zijn TYPE de naam van de omvattende lus te vermelden:

<BOUCLEx ....>
....
<BOUCLEn(BOUCLEx)></BOUCLEn>
....
</BOUCLEx>

De lus n fonctioneert alsof alles uit lus x (alle bakens en de HTML code, de conditionele voorwaarde ervoor en erna en de alternatieve voorwaarde) moet worden toegepast. Omdat de lus n binnen lus x ligt, krijgen we dus een recursief gedrag: de lus x bevat een lus n die op zijn beurt de lus x herhaalt, die lus n bevat, enzovoort, totdat de lus x geen resultaat meer oplevert. In lus n vinden we geen enkele voorwaarde, de veranderende context bij iedere volgende oproep van lus x geeft een ander resultaat, tot niets meer gevonden wordt.

Deze techniek wordt onder andere gebruikt bij het vinden van de "threads" in een forum. Een eerste lus «fabriceert» het begin van de "threads" (de berichten waarin direct op een artikel wordt gereageerd), een tweede laat de reacties op deze eerste berichten zien, enzovoort. Omdat we nooit weten hoe "diep" deze reacties kunnen gaan, moet wel met recursieve lussen worden gewerkt:

<BOUCLE_forum(FORUMS){id_article}>
   #TITRE
   <B_antwoorden>
   <ul>
   <BOUCLE_antwoorden(FORUMS){id_parent}>
      <li>#TITRE
      <BOUCLE_recursief(BOUCLE_antwoorden)>
      </BOUCLE_recursief>
      </li>
   </BOUCLE_antwoorden>
   </ul>
   </B_antwoorden>
</BOUCLE_forum>

Met deze functie kan een zeer duidelijke grafische weergave van de boomvormige structuur van een SPIP site worden weergegeven.

Opmerking 1: In sommige gevallen kan beter gezocht worden naar een oplossing met het gebruik van het baken INCLURE.

Opmerking 2: In de huidige staat van de compiler van SPIP moet de opdracht <BOUCLEn(BOUCLEx)></BOUCLEn> verschijnen in het éérste niveau van de lus x, ofwel: lus n moet direct omhuld worden door lus x en niet door een andere lus die zelf binnen lus x ligt.
Het opheffen van deze beperking wordt bestudeerd.

Opmerking 3: Er mag een homoniem baken van een van de omvattende lussen worden gebruikt door de naam van die lus te gebruiken. Daarvoor moet de naam van de lus gevolgd door een dubbele punt worden ingevoegd tussen de # en de naam van het baken. Meer details in artikel De syntax van de bakens van SPIP.

Je schrijft dus een #BAKEN van lus _mijnlus [1] alsvolgt:
#_mijnlus:BAKEN.

Auteur Hanjo Gepubliceerd op: Aangepast: 21/03/23

Vertalingen: عربي, català, Deutsch, English, Español, français, italiano, Nederlands