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