Module type Ppxlib__Ast_builder_intf.Additional_helpers
val eint : (Ppxlib__.Import.int -> Ppxlib__.Import.expression) with_locval echar : (Ppxlib__.Import.char -> Ppxlib__.Import.expression) with_locval estring : (Ppxlib__.Import.string -> Ppxlib__.Import.expression) with_locval efloat : (Ppxlib__.Import.string -> Ppxlib__.Import.expression) with_locval eint32 : (Ppxlib__.Import.int32 -> Ppxlib__.Import.expression) with_locval eint64 : (Ppxlib__.Import.int64 -> Ppxlib__.Import.expression) with_locval enativeint : (Ppxlib__.Import.nativeint -> Ppxlib__.Import.expression) with_locval ebool : (Ppxlib__.Import.bool -> Ppxlib__.Import.expression) with_locval pint : (Ppxlib__.Import.int -> Ppxlib__.Import.pattern) with_locval pchar : (Ppxlib__.Import.char -> Ppxlib__.Import.pattern) with_locval pstring : (Ppxlib__.Import.string -> Ppxlib__.Import.pattern) with_locval pfloat : (Ppxlib__.Import.string -> Ppxlib__.Import.pattern) with_locval pint32 : (Ppxlib__.Import.int32 -> Ppxlib__.Import.pattern) with_locval pint64 : (Ppxlib__.Import.int64 -> Ppxlib__.Import.pattern) with_locval pnativeint : (Ppxlib__.Import.nativeint -> Ppxlib__.Import.pattern) with_locval pbool : (Ppxlib__.Import.bool -> Ppxlib__.Import.pattern) with_locval eunit : Ppxlib__.Import.expression with_locval punit : Ppxlib__.Import.pattern with_locval evar : (Ppxlib__.Import.string -> Ppxlib__.Import.expression) with_locevar idproduces aPexp_ident _expression, it parses its input so you can pass any dot-separated identifier, for instance:evar ~loc "Foo.bar".
val pvar : (Ppxlib__.Import.string -> Ppxlib__.Import.pattern) with_locval eapply : (Ppxlib__.Import.expression -> Ppxlib__.Import.expression Ppxlib__.Import.list -> Ppxlib__.Import.expression) with_locSame as pexp_apply but without labels
val eabstract : (Ppxlib__.Import.pattern Ppxlib__.Import.list -> Ppxlib__.Import.expression -> Ppxlib__.Import.expression) with_locval esequence : (Ppxlib__.Import.expression Ppxlib__.Import.list -> Ppxlib__.Import.expression) with_locval ppat_tuple_opt : (Ppxlib__.Import.pattern Ppxlib__.Import.list -> Ppxlib__.Import.pattern Ppxlib__.Import.option) with_locval pexp_tuple_opt : (Ppxlib__.Import.expression Ppxlib__.Import.list -> Ppxlib__.Import.expression Ppxlib__.Import.option) with_locval pconstruct : Ppxlib__.Import.constructor_declaration -> Ppxlib__.Import.pattern Ppxlib__.Import.option -> Ppxlib__.Import.patternval econstruct : Ppxlib__.Import.constructor_declaration -> Ppxlib__.Import.expression Ppxlib__.Import.option -> Ppxlib__.Import.expressionval elist : (Ppxlib__.Import.expression Ppxlib__.Import.list -> Ppxlib__.Import.expression) with_locval plist : (Ppxlib__.Import.pattern Ppxlib__.Import.list -> Ppxlib__.Import.pattern) with_locval pstr_value_list : loc:Ppxlib.Location.t -> Ppxlib__.Import.Asttypes.rec_flag -> Ppxlib__.Import.value_binding Ppxlib__.Import.list -> Ppxlib__.Import.structure_item Ppxlib__.Import.listpstr_value_list ~loc rf vbs=pstr_value ~loc rf vbsifvbs <> [],[]otherwise.
val nonrec_type_declaration : (name:Ppxlib__.Import.string Ppxlib.Loc.t -> params:(Ppxlib__.Import.core_type * Ppxlib__.Import.Asttypes.variance) Ppxlib__.Import.list -> cstrs:(Ppxlib__.Import.core_type * Ppxlib__.Import.core_type * Ppxlib.Location.t) Ppxlib__.Import.list -> kind:Ppxlib__.Import.type_kind -> private_:Ppxlib__.Import.Asttypes.private_flag -> manifest:Ppxlib__.Import.core_type Ppxlib__.Import.option -> Ppxlib__.Import.type_declaration) with_locval unapplied_type_constr_conv : (Ppxlib.Longident.t Ppxlib.Loc.t -> f:(Ppxlib__.Import.string -> Ppxlib__.Import.string) -> Ppxlib__.Import.expression) with_locunapplied_type_constr_convis the standard way to map identifiers to conversion fonctions, for preprocessor that creates values that follow the structure of types. More precisely,path_conv path (sprintf "sexp_of_%s")is:- sexp_of_t if path is "t"
- A.B.sexp_of_foo if path is "A.B.foo"
- A.B.sexp_of_f__foo (module A1) (module A2) if path is "A.B.F(A1)(A2).foo"
type_constr_convalso applies it to a list of expression, which both prevents the compiler from allocating useless closures, and almost always what is needed, since type constructors are always applied.
val type_constr_conv : (Ppxlib.Longident.t Ppxlib.Loc.t -> f:(Ppxlib__.Import.string -> Ppxlib__.Import.string) -> Ppxlib__.Import.expression Ppxlib__.Import.list -> Ppxlib__.Import.expression) with_locval eta_reduce : Ppxlib__.Import.expression -> Ppxlib__.Import.expression Ppxlib__.Import.optionTries to simplify
fun v1 v2 .. -> f v1 v2 ..intof. Only works whenfis a path, not an arbitrary expression as that would change the meaning of the code. This can be used either for cleaning up the generated code, or to reduce allocation iffis a local variable (the compiler won't optimize the allocation of the closure).Eta-reduction can change the types/behavior in some corner cases that are unlikely to show up in generated code:
- if
fhas optional arguments, eta-expandingfcan drop them - because labels commute, it can change the type of an expression: $ let f ~x y = x + y let f2 = fun x -> add x;; val f : x:int -> int -> int = <fun> val f2 : int -> x:int -> int = <fun> In fact, if
fdoes side effects before receiving all its arguments, and if the eta-expansion is partially applied, eta-reducing could change behavior.
eta_reduce_if_possible_and_nonrecis meant for the case where the resulting expression is going to be bound in a potentially recursive let-binding, where we have to keep the eta-expansion whenrec_flagisRecursiveto avoid a compile error.- if
val eta_reduce_if_possible : Ppxlib__.Import.expression -> Ppxlib__.Import.expressionval eta_reduce_if_possible_and_nonrec : Ppxlib__.Import.expression -> rec_flag:Ppxlib__.Import.rec_flag -> Ppxlib__.Import.expression