\(\langname\) is a strictly typed language, in which every term should have a type in order to be wellformed and evaluated. Typing judgement of the form \(\Der{\Gamma}{e : T}\) say that \(e\) is a term of type \(T\) in the typing context \(\Gamma\).
Note that each well-typed term has exactly one type; hence we assume there exists a function \(termType: Term \to \mathcal{T}\) which relates each well-typed term with the corresponding type.
Primitive operations can be parameterized with type variables; for example,addition has the signature \(+~:~ (T,T) \to T\) where \(T\) is a numeric type. Function \(ptype\), defined in primops, returns a type of primitive operation specialized for concrete types of its arguments, for example, \(ptype(+,Int, Int) = (Int, Int) \to Int\).
Similarly, the function \(mtype\) returns a type of method specialized for concrete types of the arguments of the MethodCall term.
BlockExpr rule defines a type of well-formed block expression. It assumes a total ordering on val definitions. If a block expression is not well-formed, than is cannot be typed and evaluated.
The rest of the rules are standard for typed lambda calculus.