The expression and operation datatypes have essentially the same form as the abstract grammar. Note,
though, that it does not exactly match the semantics, as that allowed arbitrary integers whereas here we use
the bounded Moscow ML integers { so not every term of the abstract syntax is representable as an element of
type expr, and the interpreter will fail with an over
ow exception if + over
ows.