sig
  module Ast :
    sig
      type t =
          Num of int
        | Var of string
        | Op of Op.t * S.Ast.t * S.Ast.t
        | Ifz of S.Ast.t * S.Ast.t * S.Ast.t
        | Let of string * S.Ast.t * S.Ast.t
        | App of S.Ast.t * S.Ast.t
        | Fun of string * S.Ast.t
        | Fix of string * S.Ast.t
      val print : Pervasives.out_channel -> S.Ast.t -> unit
    end
  module Reader :
    sig
      val from_chan : Pervasives.in_channel -> S.Ast.t
      val from_string : string -> S.Ast.t
    end
  module Top :
    sig
      val loop :
        (Pervasives.out_channel -> '-> unit) ->
        ('Env.t -> S.Ast.t -> 'a) -> unit
    end
end