sig
  module Ast :
    sig
      type label = string
      type t =
          Num of int
        | Var of string
        | Op of Op.t * O.Ast.t * O.Ast.t
        | Ifz of O.Ast.t * O.Ast.t * O.Ast.t
        | Let of string * O.Ast.t * O.Ast.t
        | App of O.Ast.t * O.Ast.t
        | Fun of string * O.Ast.t
        | Fix of string * O.Ast.t
        | Rec of (O.Ast.label * O.Ast.t) list
        | Access of O.Ast.t * O.Ast.label
        | CopyWith of O.Ast.t * (O.Ast.label * O.Ast.t) list
        | Obj of string option * (O.Ast.label * O.Ast.t) list
        | Invoke of O.Ast.t * O.Ast.label
        | ObjWith of string option * O.Ast.t * (O.Ast.label * O.Ast.t) list
    end
  module Reader :
    sig
      val from_chan : Pervasives.in_channel -> O.Ast.t
      val from_string : string -> O.Ast.t
    end
  module Top :
    sig
      val loop :
        (Pervasives.out_channel -> '-> unit) ->
        ('Env.t -> O.Ast.t -> 'a) -> unit
    end
end