summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--def.tex1
-rw-r--r--defio.tex9
-rw-r--r--defstate.tex6
-rw-r--r--intro.tex27
-rw-r--r--introexmp.tex7
-rw-r--r--rulescat.tex2
-rw-r--r--rulesquotify.tex4
-rw-r--r--werkstuk.tex2
8 files changed, 38 insertions, 20 deletions
diff --git a/def.tex b/def.tex
index 79079e3..ccc30b6 100644
--- a/def.tex
+++ b/def.tex
@@ -2,6 +2,7 @@
\section{Definities}
\label{sec:def}
+\input{defmeta}
\input{defsyn}
\input{defio}
\input{defstate}
diff --git a/defio.tex b/defio.tex
index 4e61ac5..28fc732 100644
--- a/defio.tex
+++ b/defio.tex
@@ -6,17 +6,18 @@ Allereerst definiëren we het type $\Stack{a}$, omdat stacks we veel met stacks
doen in onze semantiek regels. Een $\Stack{a}$ (lees: een stack van elementen
van type $a$) is een simpel datatype met de volgende syntax:
+\def\inbrackets#1{$\mathrm{[}#1\mathrm{]}$}
+\def\bracka{\inbrackets{a}}
\begin{grammar}
- <Stack[a]> ::= [<a>:<Stack[a]>] | `Nil'
- %todo formatting
+ <Stack \bracka> ::= [<a>:<Stack \bracka>] | `Nil'
\end{grammar}
Op een stack zijn twee instructies gedefinieerd:
\begin{gather*}
\pushop : a \times \Stack{a} \to \Stack{a} \\
- \push{e}{s} \isdef [e:s] \\[1em]
+ \push{e}{\stk} \isdef [e:\stk] \\[1em]
\popop : \Stack{a} \hookrightarrow a \times \Stack{a} \\
- \pop{[e:s]} \isdef (e,s) \\
+ \pop{[e:\stk]} \isdef (e,\stk) \\
\end{gather*}
$\popop$ is een partiële functie omdat $\pop\Nil$ niet gebruikt mag worden in
diff --git a/defstate.tex b/defstate.tex
index e54c888..b748c98 100644
--- a/defstate.tex
+++ b/defstate.tex
@@ -29,10 +29,10 @@ $\str~k$. Vervolgens definiëren we $\putop:\SynString \times \SynString \times
waarde en een oude store een nieuwe store oplevert:
$$
- \put{\var}{\val}{\str} k =
+ \put{\var}{\val}{\str} \var' =
\begin{cases}
- \val & \text{als $k=\var$} \\
- \str~k & \text{als $k\ne\var$}
+ \val & \text{als $\var'=\var$} \\
+ \str~\var' & \text{als $\var'\ne\var$}
\end{cases}
$$
diff --git a/intro.tex b/intro.tex
index df82f41..6f99329 100644
--- a/intro.tex
+++ b/intro.tex
@@ -3,7 +3,7 @@
\label{sec:intro}
Smurf is een esoterische programmeertaal oorspronkelijk ontworpen door Matthew
-Westcott. In de specificatie \cite{safalra} beschrijft hij kort wat Smurf is:
+Westcott. In de specificatie~\cite{safalra} beschrijft hij kort wat Smurf is:
\begin{quote}
Smurf = String-based MURiel Forthoid
@@ -11,12 +11,20 @@ Westcott. In de specificatie \cite{safalra} beschrijft hij kort wat Smurf is:
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
-die we hiervan 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.
+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:
@@ -47,8 +55,9 @@ illustreren met een voorbeeld:
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 verwijdert. De stack bestaat nu dus uit het element
- `smurf'. Met \smurfinline{o} sturen we deze string naar de output.
+ waarde ervan op de stack te zetten. Hierbij wordt het bovenste element van de
+ stack verwijdert. De stack bestaat nu dus uit het element `smurf'. Met
+ \smurfinline{o} sturen we deze string naar de output.
\end{exmp}
\input{introcoms}
diff --git a/introexmp.tex b/introexmp.tex
index 94c0afc..2ebe1eb 100644
--- a/introexmp.tex
+++ b/introexmp.tex
@@ -43,6 +43,13 @@ aangeven hoe conditionele executie kan worden behaald in Smurf.
\smurfinline{+"o"+} bouwen we hiervan het programma \smurfinline{"mijn
string"ho}, wat we met \smurfinline{x} uitvoeren. De uitvoer van het
programma is dus `m', in dit geval.
+
+ Wat gebeurt er als de gebruiker iets anders dan `head' of `tail' invoert? In
+ dit geval bestaat er geen variabele met de naam die de gebruiker had
+ ingevoerd. Het commando \smurfinline{g} levert dan de lege string op. Dit
+ betekent dat we het programma \smurfinline{"mijn string"o} bouwen. Als de
+ gebruiker dus geen correcte keuze maakt, dan zal de hele string worden
+ teruggegeven.
\end{exmp}
\begin{exmp}
diff --git a/rulescat.tex b/rulescat.tex
index 48dcddf..f36f0ec 100644
--- a/rulescat.tex
+++ b/rulescat.tex
@@ -16,7 +16,7 @@ Dit geeft de volgende regel:
$$
\begin{prooftree}
\trans
- {\pgm}{\ip}{(\push{s1~s2}{\stk''}, \str)}
+ {\pgm}{\ip}{(\push{s_1~s_2}{\stk''}, \str)}
{\ip'}{\op}{\st}
\justifies
\trans
diff --git a/rulesquotify.tex b/rulesquotify.tex
index e0bdd4c..8ebe567 100644
--- a/rulesquotify.tex
+++ b/rulesquotify.tex
@@ -19,11 +19,11 @@ $$
\begin{prooftree}
\trans
{\pgm}{\ip}{(\push{\texttt{"}\escape{s}\texttt{"}}{\stk'}, \str) }
- {\ip}{\op}{\st}
+ {\ip'}{\op}{\st}
\justifies
\trans
{\StmQuotify:\pgm}{\ip}{(\stk,\str)}
- {\ip}{\op}{\st}
+ {\ip'}{\op}{\st}
\using{\rquotifyns}
\qquad
\text{met $\pop{\stk} = (s, stk')$.}
diff --git a/werkstuk.tex b/werkstuk.tex
index 632d685..24a290f 100644
--- a/werkstuk.tex
+++ b/werkstuk.tex
@@ -35,7 +35,7 @@
parent=section,
spacebelow=1em,
preheadhook=\nobreak\noindent\hrulefill,
- prefoothook=\vspace*{\dimexpr-\baselineskip+\topsep\relax}\endgraf\nobreak\noindent\hrulefill
+ prefoothook=\vspace*{\dimexpr-\baselineskip+\topsep\relax}\endgraf\nobreak\noindent\hrulefill%
]{lined}
\declaretheorem[style=lined]{exmp}