\section{Preliminary definitions} \label{sec:predefs} A number of types will turn out to be useful in general. We define: \lstinputlisting[firstline=25,lastline=28]{While/Common.dcl} The \CI{Error} type distinguishes between different kinds of errors, that can be further identified with a descriptive string. We could add more information to these types, like the position (file, line and column) of the input token that causes the error. The implementation thereof is straightforward and will for the sake of brevity be omitted here. We can model the partial state function as a function that yields an \CI{Either Error Int}. Whenever a variable is not defined, a \CI{Left (Runtime "Undefined")} will be returned. Otherwise, a \CI{Right n} is returned. The initial state, which maps any variable to a \CI{Left} result, is implemented as an instance of the \CI{zero} class. \lstinputlisting[firstline=9,lastline=10]{While/WhileCommon.dcl} \lstinputlisting[firstline=12,lastline=13]{While/WhileCommon.icl} In order to build up our interpreter modularly, we wouldn't want to fix the type of the AST just yet. Rather, we want it to be possible to implement different kinds of abstract syntax trees: for example, it may be interesting to implement a While program as a list of statements (making composition implicit), while the straightforward AST would use a compositional constructor. To allow for different ASTs, we make the \CI{run} function, that will interpret a While program in some state, overloaded: \lstinputlisting[firstline=35,lastline=35]{While/WhileCommon.dcl} Similarly, we want to be able to use the same terminology of \emph{evaluation} for both arithmetic and boolean expressions. This can be done using overloading as well: \lstinputlisting[firstline=37,lastline=39]{While/WhileCommon.dcl} The \CI{eval} function may yield an error, for example when an undefined variable is used. It makes sense to separate evaluation and interpretation, because evaluation does not depend on the type for statements. Any AST using \CI{AExpr} may now use this \CI{eval} function (while it is also possible to create an AST that uses a different representation of arithmetic expressions). Although all these functions are presented in an overloaded fashion, we will only consider one implementation, the AST from \autoref{sec:ast} below. Other models do not introduce additional problems that would be interesting for the purposes of this paper.