blob: bed29e201d0cd281950c1f83e9009ee9d59c06b1 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
% vim: set spelllang=nl:
\subsection{Types}
\label{sec:cleansmurf:types}
Het programma houdt de expressieve syntax uit \autoref{sec:def:syn} aan. Het
type \CI{Stm} is dus:
\lstinputlisting[firstline=15,lastline=20]{CleanSmurf/Smurf.dcl}
We gebruiken lijsten als stacks en implementeren de store met behulp van een
tabel van naam-waarde paren:
\lstinputlisting[firstline=22,lastline=27]{CleanSmurf/Smurf.dcl}
Ten slotte definiëren we transities. Aangezien alle semantiekregels hooguit één
premisse hebben, kunnen we een afleidingsboom als lijstje transities zien:
\lstinputlisting[firstline=35,lastline=36]{CleanSmurf/Smurf.dcl}
Met deze definities kunnen we een \CI{step :: Program State -> Maybe (Program,
State)} definiëren. Dit komt bijna overeen met de structuur van transities. We
moeten een \CI{Program} teruggeven, omdat we slechts één stap zetten. Wat dit
betreft lijken de regels van \emph{CleanSmurf} meer op regels in structurele
operationele semantiek. We hebben al laten zien dat deze regels erg veel lijken
op die in natuurlijke semantiek.
Het type van \CI{step} neemt nog geen Input/Output mee. We maken er een
overloaded functie van, zodat hij voor meerdere inputmethodes kan worden
gebruikt. Het uiteindelijke type is:
\lstinputlisting[firstline=56,lastline=56]{CleanSmurf/Smurf.dcl}
Hoe dit precies werkt is niet belangrijk voor de beschrijving hier. Het derde
argument, van type \CI{io}, is de `IO-toestand'. Het vierde argument, van type
\CI{IO io}, omvat een input-functie die strings oplevert (gegeven de
IO-toestand) en een output-functie die strings opneemt (in de IO-toestand).
\medskip
Verder definiëren we een aantal hulpfuncties:
\lstinputlisting[firstline=232,lastline=245]{CleanSmurf/Smurf.icl}
De partiële functies zijn hier gesimuleerd met het \CI{Maybe}-type. Dit laat
ons monadische operatoren gebruiken in het uitwerken van de interpreter.
|