sig
  type expression =
      Nil
    | Number of int
    | String of string
    | Boolean of bool
    | Variable of string
    | Abstraction of string list * Lang.expression
    | NamedAbstraction of string * string list * Lang.expression list
    | Application of Lang.expression * Lang.expression list
    | IfExpression of Lang.expression * Lang.expression * Lang.expression
    | LetExpression of (string * Lang.expression) list * Lang.expression
  type program = Lang.expression list
  type value =
      NilVal
    | NumVal of int
    | StrVal of string
    | BoolVal of bool
    | ConsVal of Lang.value * Lang.value
    | FuncVal of (Lang.value list -> Lang.value)
  type env = (string * Lang.value) list
  val _let :
    (string * Lang.expression) list -> Lang.expression -> Lang.expression
  exception RuntimeException of string
  val string_of_value : Lang.value -> string
  val string_of_program : Lang.program -> string
  val value_of_expression : Lang.env -> Lang.expression -> Lang.value
  val eval : Lang.program -> Lang.value
end