diff options
-rw-r--r-- | intro.tex | 56 | ||||
-rw-r--r-- | introcoms.tex | 40 | ||||
-rw-r--r-- | org.tex | 11 | ||||
-rw-r--r-- | preamble.tex | 18 | ||||
-rw-r--r-- | smurf.sty | 4 | ||||
-rw-r--r-- | werkstuk.tex | 5 |
6 files changed, 130 insertions, 4 deletions
diff --git a/intro.tex b/intro.tex new file mode 100644 index 0000000..742208e --- /dev/null +++ b/intro.tex @@ -0,0 +1,56 @@ +% 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} +We hebben dus te maken met een Forth-achtige programmeertaal. De eigenschappen +hiervan die we terugzien in Smurf zijn voornamelijk reflection, +stackgeörienteerd en `geconcateneerd programmeren'. We kunnen het programma dus +dynamisch aanpassen, werken met een stack en schrijven een programma als één +grote functiecompositie (zonder met functieapplicaties te werken). Voordat we +alle commando's bespreken is een 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. De stack bestaat nu dus uit het element + `smurf'. Met \smurfinline{o} sturen we deze string naar de output. +\end{exmp} + +\input{introcoms} +\input{org} + diff --git a/introcoms.tex b/introcoms.tex new file mode 100644 index 0000000..3d62ad4 --- /dev/null +++ b/introcoms.tex @@ -0,0 +1,40 @@ +% vim: set spelllang=nl: +\subsection{Commando's} +\label{sec:intro:commands} +We zullen nu kort op informele wijze de verschillende commando's in Smurf +beschrijven. We geven telkens de notatie in Smurf syntax en een leesbaarder +alternatief dat we hieronder zullen gebruiken. Wanneer een commando iets met +elementen op de stack doet, worden die elementen altijd verwijderd. + +\begin{description}[style=nextline,font=\normalfont] + \item[\smurfinline{"..."} of $\StmPush~\texttt{...}$] + waarbij `\texttt{...}' een string is. Zet de string \texttt{...} op de + stack. + \item[\smurfinline{+} of $\StmCat$] + Concateneert de bovenste twee strings (laagste eerst) op de stack en zet + het resultaat op de stack. + \item[\smurfinline{i} of $\StmInput$] + Plaatst een string van `user input' op de stack. Hierbij wordt + \texttt{\textbackslash} gebruikt om LF-karakters, dubbele aanhalingstekens + en backslashes te escapen. + \item[\smurfinline{o} of $\StmOutput$] + Stuurt het bovenste element van de stack naar `de output'. + \item[\smurfinline{p} of $\StmPut$] + Zet de waarde van de variabelenaam bovenop de stack tot de string daaronder + op de stack. + \item[\smurfinline{h} of $\StmHead$] + Zet het eerste karakter van de string bovenop de stack als string op de + stack. + \item[\smurfinline{t} of $\StmTail$] + Zet alles behalve de head van de string bovenop de stack op de stack. + \item[\smurfinline{q} of $\StmQuotify$] + Manipuleert de string bovenop de stack zodat die als $\StmPush$-commando in + een Smurfprogramma kan worden gebruikt: escapet LF-karakters, dubbele + aanhalingstekens en backslashes met een backslash, en plaatst dubbele + aanhalingstekens om de hele string. Het resultaat wordt op de stack gezet. + \item[\smurfinline{x} of $\StmExec$] + Voert de string bovenop de stack uit als Smurfprogramma. Het programma + begint met een schone toestand, d.w.z. met een lege stack en variable + store. +\end{description} + @@ -0,0 +1,11 @@ +% vim: set spelllang=nl: +\subsection{Organisatie} %todo titel + +In \autoref{sec:def} beschrijven we formele definities om de semantiek van +Smurf te kunnen specificeren. We kijken naar de syntax, input en output, de +programmatoestand en de transities in de natuurlijke semantiek die we gaan +definiëren. \autoref{sec:rules} beschrijft vervolgens per statement in de +syntax de formele semantiek. Hierbij baseren we ons op de Smurf specificatie +\cite{safalra}, waarbij we dingen verhelderen en ongedefinieerd gedrag +definiëren. + diff --git a/preamble.tex b/preamble.tex index 3f6c165..a1ef557 100644 --- a/preamble.tex +++ b/preamble.tex @@ -7,18 +7,30 @@ % Standaard packages \usepackage[hidelinks]{hyperref} \usepackage[utf8]{inputenc} -\usepackage[dutch]{babel} +\usepackage[dutch,shorthands=off]{babel} \usepackage{geometry} % Taakspecifieke packages \usepackage{amsmath} +\usepackage{amsthm} +\usepackage{enumitem} \usepackage{prooftree} \usepackage{stackrel} \usepackage{syntax} +\usepackage{thmtools} % Eigen packages \usepackage{smurf} -% Fix voor babel dutch -\everymath{\shorthandoff{"}} +\setlist{itemsep=0pt} + +% Eigen commando's en environments, niet specifiek voor Smurf +\declaretheoremstyle[ + title=Voorbeeld, + parent=section, + spacebelow=1em, + preheadhook=\nobreak\noindent\hrulefill, + prefoothook=\vspace*{\dimexpr-\baselineskip+\topsep\relax}\endgraf\nobreak\noindent\hrulefill +]{lined} +\declaretheorem[style=lined]{exmp} @@ -77,3 +77,7 @@ \def\var{\mathit{var}} \def\val{\mathit{val}} +% Programs +\newenvironment{smurf}{\tt\begin{center}}{\end{center}} +\let\smurfinline\texttt + diff --git a/werkstuk.tex b/werkstuk.tex index ccb6f49..aad78ef 100644 --- a/werkstuk.tex +++ b/werkstuk.tex @@ -3,10 +3,13 @@ \begin{document} +% Fix voor babel dutch +\shorthandoff{"} + \maketitle \input{abs} -% todo intro +\input{intro} \input{def} \input{rules} |