% vim: set spelllang=nl: \subsubsection{Het buitenste programma} Het buitenste programma controleert of we te maken hebben met de lege string als inputstring. Als dit het geval is geeft het de lege string als output. Anders wordt het recursieve subprogramma gebruikt, dat alleen voor strings van lengtes groter dan nul gedefinieerd is. Omdat Smurf geen conditionals kent, moeten we hier op een slimme manier omgaan met het feit dat waarden ook als variabelenaam kunnen worden gebruikt. Dit is vergelijkbaar met \autoref{exmp:headortail}. Eerst schrijven we het recursieve programma dat we moeten aanroepen als de inputstring niet leeg is naar de variabele met als naam de inputstring zelf. Hierna schrijven we het programma dat moet worden uitgevoerd als de string leeg is (het outputten van de lege string) naar de variabele met als naam de lege string. Als de inputstring leeg is overschrijven we daar dus het recursieve programma dat we eerst aan die variabele hadden toegewezen. Als laatste voeren we het programma uit dat op de variabele met naam de inputstring staat. Het buitenste programma ziet er als volgt uit: \begin{center} \makebox{ \parbox{45mm}{ \begin{smurf} \footnotesize i "input" p\\ "input" g\\ "input" g q\\ "\textbackslash{}"\textbackslash{}""\emph{subprogramma-string}\\ +\\ "input" g p\\ "\textbackslash{}"\textbackslash{}"o" "" p\\ g x \end{smurf} } \parbox{8mm}{ \begin{smurf} \footnotesize (1)\\ (2)\\ (3)\\ ~\\ ~\\ (4)\\ (5)\\ (6) \end{smurf} }} \end{center} \begin{enumerate} \item Allereerst wordt de inputstring op de stack gezet en naar de variabele met naam \smurfinline{input} geschreven. De stack is nu weer leeg. \item We zetten de inputwaarde weer op de stack voor later gebruik. Waarom dit nodig is wordt uitgelegd in punt 4. \item Hierna halen we deze inputwaarde voor de tweede keer op, quotifyen we hem en voegen we het toe aan het begin van de subprogramma-string. Dit is vergelijkbaar met het doorgeven van een functieargument. De reden dat we de input quotifyen is dat dit ervoor zorgt dat alle karakters in de input behouden blijven (ook die met speciale betekenis zoals \lit{\textbackslash{}}) wanneer het subprogramma wordt uitgevoerd. Het subprogramma staat zelf al gequotifyed hier. Op dit moment staat het grote programma met de input eraan voorgevoegd op de stack, met als element eronder de inputwaarde die we zo nodig hebben. \item Nu halen we opnieuw de waarde van de input op uit de variabele waarnaar we het eerst hadden weggeschreven en gebruiken we dit als een variabelenaam om het subprogramma naar weg te schrijven. Merk op dat we onze opslag van de inputstring verliezen als die toevallig de waarde \smurfinline{input} had, omdat we die variabele dan overschrijven. Dit is waarom we deze waarde van tevoren een keer extra op de stack hebben gezet. Zo kunnen we hem bij (6) nog gebruiken. \item Nu zetten we het gequotifyde programma "output de lege string" in de variabele $\lambda$. Ongequotifyed ziet het uit als \smurfinline{""o}. \item Als laatste halen we het programma op van de variabele met als naam de inputstring die we in (2) op de stack hadden gezet en voeren we dit programma uit. \end{enumerate}