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

Smurf is een esoterische programmeertaal oorspronkelijk ontworpen door Matthew
Westcott. In het kort zijn de belangrijkste eigenschappen van Smurf 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 \lit{papasmurf}.

	We hebben spaties toegevoegd 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 \lit{smurf} en \lit{papa} op de stack zijn gezet gebruiken we
	\smurfinline{p} om de variabele \lit{papa} de waarde \lit{smurf} te geven.
	Hierna is de stack weer leeg. Vervolgens zetten we \lit{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 \lit{smurf}. Met \smurfinline{o} sturen we deze string
	naar de output.
\end{exmp}

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