Une fonction récursive ne faisant pas fi des \fi

Tout ce qui concerne le langage TeX/LaTeX et ses variantes. Ce langage est utilisable sur le forum via les balises tex.
[participation réservée aux membres inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 1957
Inscription : samedi 29 décembre 2007, 00:58

Une fonction récursive ne faisant pas fi des \fi

Message non lu par projetmbc »

Bonjour.

Ne comprenant rien ou presque à $\TeX$, je suis entrain de me mettre sérieusement à $\LaTeX{}3$ qui correspond mieux à mon cerveau de codeur du dimanche. J'en profite pour rédiger des exemples d'introduction de bas niveau, le mien, à $\LaTeX{}3$ en vue de proposer ensuite un document d'introduction à ce langage.

MA RECHERCHE.

Je sais qu'il existe des macros récursives $\TeX$ pour lesquelles il faut gérer l'expansion des \fi. Quelqu'un de compétent pourrait-il me donner un exemple le plus basique possible d'une telle macro récursive ?
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 901
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Une fonction récursive ne faisant pas fi des \fi

Message non lu par un bon petit »

projetmbc a écrit : mercredi 14 juillet 2021, 13:48 Ne comprenant rien ou presque à $\TeX$, je suis entrain de me mettre sérieusement à $\LaTeX{}3$ qui correspond mieux à mon cerveau de codeur du dimanche
Oui, c'est malheureusement le chemin que suivent trop de gens. Penser qu'on peut efficacement programmer en LaTeX3 sans comprendre les mécanismes de TeX est une totale illusion.
Illusion consciencieusement entretenue et assumée par les auteurs de LateX3, ainsi que de toute la clique qui en fait la promotion/prosélytisme sur stackexchange.
Je sais qu'il existe des macros récursives $\TeX$ pour lesquelles il faut gérer l'expansion des \fi. Quelqu'un de compétent pourrait-il me donner un exemple le plus basique possible d'une telle macro récursive ?
Une macro récursive en TeX (ou en LaTeX2 ou LaTeX3, car le langage sous-jacent est toujours TeX :mrgreen: ) implique toujours de se poser la question : que reste-t-il sur la pile d'entrée à chaque récursivité ?

Ceci dit, c'est de l'algorithmique générale et cette question n'est absolument pas spécifique à TeX, LaTeX2 ou LaTeX3.

Bref, si la répons est « rien », la récursivité est terminale (et c'est le bien), sinon (c'est le mal absolu) car on court toujours le risque de saturer la pile d'entrée du compilateur (ici, de TeX) en cas d'appels récursifs très nombreux et/ou de beaucoup de tokens laissés sur la pile d'entrée. D'une façon générale le nombre maximal de tokens laissés sur la pile d'entrée est égal à n*k où n est le nombre maximal d'itérations et k, qui est possiblement variable, est le nombre de tokens laissés à chaque itération sur la pile d'entrée. Pour que la compilation se fasse sans saturer la pile d'entrée, il faut que n*k<=N où N est la taille disponible sur la pile d'entrée lors du 1er appel à la macro récursive.

Pour que la récursivité soit terminale, il faut construire sa macro pour que l'appel récursif soit le dernier token du code de la macro récursive et pour ce faire, il faut parfois faire disparaitre des tokens. Les \else ou \fi sont souvent ceux-là car ils font partie du test effectué à chaque fois pour savoir s'il faut sortir ou non de la récursivité. Il me semble que pas mal d'exemples de récursivités terminales/non terminales sont donnés dans le bouquin «Apprendre à programmer en TeX»...

Voici une récursivité non terminale, où TeX plante si le nombre d'itérations est supérieur à 4995 :

Code : Tout sélectionner

\documentclass{article}
\def\silentloop#1{% effectue #1 boucles
	\ifnum#1>0
		\expandafter\silentloop\expandafter{\number\numexpr#1-1}% récursivité NON terminale, il reste 1 token (\fi) à chaque appel
	\fi}
\begin{document}
\silentloop{4990}% OK avec 4990 mais ECHEC avec 5000 -> pile d'entrée saturée
\end{document}
Et le même avec une récursivité terminale

Code : Tout sélectionner

\documentclass{article}
\def\silentloop#1{% effectue #1 boucles
	\ifnum#1>0
		\expandafter\silentloop\expandafter{\number\numexpr#1-1\expandafter}% récursivité terminale, il reste rien à chaque appel
	\fi}
\begin{document}
\silentloop{6000}% OK, quel que soit le nombre d'itérations
\end{document}
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 1957
Inscription : samedi 29 décembre 2007, 00:58

Re: Une fonction récursive ne faisant pas fi des \fi

Message non lu par projetmbc »

Mon post n'avait pas pour but de lancer un débat sur TeX ou pas TeX, Stack ou pas Stack, pain au chocolat ou chocolatine. :lol: Franchement peu m'importe (au passage, j'ai prévu de lire le Knuth donc...).

De toute façon, j'ai fait mon choix pour toutes les macros un peu techniques et pour le moment cela me convient totalement. J'obtiens du code facile à coder, à analyser et donc à maintenir. Et pour ce qui est basique là on reste sur du classique car LaTeX3 devient inutilement verbeux.

Je vais regarder ce qu'il en est des exemples proposés. Si cela ne répond pas à ma recherche je préciserais.

Un grand merci pour ces propositions.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 901
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Une fonction récursive ne faisant pas fi des \fi

Message non lu par un bon petit »

projetmbc a écrit : mercredi 14 juillet 2021, 18:26Un grand merci pour ces propositions.
Mouais. Je vois que vous êtes déjà retourné sur ce site infâme y poser des questions auxquelles on pourrait répondre ici, mais pourquoi agir ainsi ?
projetmbc a écrit : What should I do because the following code is wrong?

Code : Tout sélectionner

\documentclass[12pt,a4paper]{article}

\usepackage[utf8]{inputenc}
\usepackage[french]{babel, varioref}

\providecommand\og{{\leavevmode\raise0.25ex\hbox{$\scriptscriptstyle\ll$}}\,}

\providecommand\fg{\,{\raise0.25ex\hbox{$\scriptscriptstyle\gg$}}}


\begin{document}

\og ABCD \fg{} et \og EFGH \fg{}.

\end{document}
Ce code n'est pas « wrong », il est juste moche mais bon. Par ailleurs, il manque le \unskip
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 1957
Inscription : samedi 29 décembre 2007, 00:58

Re: Une fonction récursive ne faisant pas fi des \fi

Message non lu par projetmbc »

Au temps pour moi, j'avais zappé ce point.

Merci et restons libre de surfer où l'on veut...

PS : pour le code, dans mon cas c'est de l'ordre du patch infâme mais assumé.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 901
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Une fonction récursive ne faisant pas fi des \fi

Message non lu par un bon petit »

projetmbc a écrit : dimanche 18 juillet 2021, 23:25pour le code, dans mon cas c'est de l'ordre du patch infâme mais assumé.
À tel point que je croyais que vous étiez l'auteur de ce truc horrible. Impossible pour moi d'imaginer que ce machin provenait de french ! Mea culpa.