summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamil Staps2016-04-29 12:05:52 +0200
committerCamil Staps2016-04-29 12:05:52 +0200
commit6ae77313606978502e1d4611249cd85a7b9d2651 (patch)
treec8428db6398743917ace3d54c0b9b2f86edb9071
parentLabels (diff)
Inleiding
-rw-r--r--intro.tex56
-rw-r--r--introcoms.tex40
-rw-r--r--org.tex11
-rw-r--r--preamble.tex18
-rw-r--r--smurf.sty4
-rw-r--r--werkstuk.tex5
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}
+
diff --git a/org.tex b/org.tex
new file mode 100644
index 0000000..09f53a7
--- /dev/null
+++ b/org.tex
@@ -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}
diff --git a/smurf.sty b/smurf.sty
index de227bf..036fba5 100644
--- a/smurf.sty
+++ b/smurf.sty
@@ -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}