let { List } = import! std.list let { Map } = import! std.map let { Option } = import! std.option let { Result } = import! std.result let { Eff } = import! std.effect let { State } = import! std.effect.state let { Error } = import! std.effect.error rec type Expr = | Atom String | Int Int | Float Float | List (List Expr) | Function Function | Primitive (forall r . List Expr -> Eff (LispEffect r) Expr) type Function = { params : List String, vararg : Option String, body : List Expr, closure : Map String Expr } type LispState = Map String Expr type LispEffect r a = [| error : Error String, state : State LispState | r |] a in { Expr, Function, LispState, LispEffect }