% vim: set spelllang=nl:
\section{Inleiding}
\label{sec:intro}

Smurf is een esoterische programmeertaal oorspronkelijk ontworpen door Matthew
Westcott. In de specificatie~\cite{safalra} beschrijft hij kort wat Smurf is:
\begin{quote}
	Smurf = String-based MURiel Forthoid

	Smurf is a tarpit based on the self-propagation paradigm featured in Muriel.
	The only native data type is the string, and operations are carried out on
	strings in a forty manner.
\end{quote}
Voor iemand die niet in de materie zit is deze beschrijving misschien wat
overweldigend. Het gaat om een Forth-achtige programmeertaal. De eigenschappen
van Forth die belangrijk zijn in Smurf, zijn de volgende:
\begin{itemize}
	\item Stack-geörienteerd: alle operaties werken op een stack van strings.
	\item Reflection: het is mogelijk (en in veel gevallen zelfs noodzakelijk)
		het programma zichzelf dynamisch aan te laten passen.
	\item `Geconcateneerd programmeren': de taal kent geen functieapplicatie maar
		alleen functiecompositie. Een programma is een functie, opgebouwd uit
		kleinere functies. Bij het uitvoeren wordt die grote functie toegepast op
		de initiële toestand. Bij deze initiële toestand hoort bijvoorbeeld een
		lege stack.
\end{itemize}
Voordat we alle commando's bespreken is een klein voorbeeld op zijn plaats.

\begin{exmp}
	We bekijken het volgende programma:
	\begin{smurf}"papa" "smurf" + o\end{smurf}
	Hier gebruiken we drie functiecomposities om vier functies aan elkaar te
	knopen:
	\begin{itemize}
		\item \smurfinline{"papa"} zet de string `\texttt{papa}' op de stack.
		\item \smurfinline{"smurf"} zet de string `\texttt{smurf}' op de stack.
		\item \smurfinline{+} concateneert de twee elementen bovenop de stack
			(eerst gepushte element eerst) en zet het resultaat op de stack.
		\item \smurfinline{o} output het element bovenop de stack.
	\end{itemize}
	De output van dit programma is dus `papasmurf'.

	We hebben spaties gebruikt voor de leesbaarheid. Dit is toegestaan maar niet
	vereist. Het programma \smurfinline{"papa""smurf"+o} is eveneens geldig.
\end{exmp}

Naast de stack kent Smurf ook een \emph{variable store} die variabelenamen
(strings) naar waardes (strings) stuurt. Het gebruik hiervan is best te
illustreren met een voorbeeld:

\begin{exmp}
	We bekijken het volgende programma:
	\begin{smurf}"smurf" "papa" p "papa" g o\end{smurf}
	Nadat `smurf' en `papa' op de stack zijn gezet gebruiken we \smurfinline{p}
	om de variabele `papa' de waarde `smurf' te geven. Hierna is de stack weer
	leeg. Vervolgens zetten we `papa' op de stack en gebruiken we \smurfinline{g}
	om het bovenste element als variabele op te zoeken in de variable store en de
	waarde ervan op de stack te zetten. Hierbij wordt het bovenste element van de
	stack verwijderd. De stack bestaat nu dus uit het element `smurf'. Met
	\smurfinline{o} sturen we deze string naar de output.
\end{exmp}

\input{introcoms}
\input{introexmp}
\input{org}
