package catala

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Module Shared_ast.ExprSource

Functions handling the expressions of shared_ast

Boxed constructors

Sourceval box : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Box the expression from the outside

Sourceval unbox : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

For closed expressions, similar to Bindlib.unbox

Sourceval unbox_closed : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Similar to unbox, but with an added assertion check on the expression being closed

Sourceval rebox : (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Rebuild the whole term, re-binding all variables and exposing free variables

Sourceval evar : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed Var.t -> 'm Shared_ast__.Definitions.mark -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval eexternal : name:Shared_ast__.Definitions.external_ref Catala_utils.Mark.pos -> 'm Shared_ast__.Definitions.mark -> ((< explicitScopes : Shared_ast__.Definitions.no.. >, < explicitScopes : Shared_ast__.Definitions.no.. >, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval bind : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed Var.t array -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed) Bindlib.mbinder Bindlib.box
Sourceval subst : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed) Bindlib.mbinder -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed list -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval etuple : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed list -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval etupleaccess : e: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> index:int -> size:int -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval earray : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed list -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval elit : Shared_ast__.Definitions.lit -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval eabs : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed) Bindlib.mbinder Bindlib.box -> Catala_utils.Pos.t list -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos list -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval eabs_ghost : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed) Bindlib.mbinder Bindlib.box -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos list -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Same as eabs but without binders' positions

Sourceval eapp : f: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> args: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed list -> tys:Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos list -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval eassert : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> 'm Shared_ast__.Definitions.mark -> ((< assertions : Shared_ast__.Definitions.yes.. > as 'a, < assertions : Shared_ast__.Definitions.yes.. > as 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval efatalerror : Catala_runtime.error -> 'm Shared_ast__.Definitions.mark -> ((< .. >, < .. >, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval epos : Catala_utils.Pos.t -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval eappop : op:'a Shared_ast__.Definitions.Op.t Catala_utils.Mark.pos -> args: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed list -> tys:Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos list -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval edefault : excepts: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed list -> just: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> cons: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> 'm Shared_ast__.Definitions.mark -> ((< defaultTerms : Shared_ast__.Definitions.yes.. > as 'a, < defaultTerms : Shared_ast__.Definitions.yes.. > as 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval epuredefault : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> 'm Shared_ast__.Definitions.mark -> ((< defaultTerms : Shared_ast__.Definitions.yes.. > as 'a, < defaultTerms : Shared_ast__.Definitions.yes.. > as 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval eifthenelse : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval eempty : 'm Shared_ast__.Definitions.mark -> ((< defaultTerms : Shared_ast__.Definitions.yes.. > as 'a, < defaultTerms : Shared_ast__.Definitions.yes.. > as 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval eerroronempty : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> 'm Shared_ast__.Definitions.mark -> ((< defaultTerms : Shared_ast__.Definitions.yes.. > as 'a, < defaultTerms : Shared_ast__.Definitions.yes.. > as 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval elocation : 'a Shared_ast__.Definitions.glocation -> 'm Shared_ast__.Definitions.mark -> ((< .. > as 'a, < .. > as 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval estruct : name:Shared_ast__.Definitions.StructName.t -> fields: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed Shared_ast__.Definitions.StructField.Map.t -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval edstructamend : name_opt:Shared_ast__.Definitions.StructName.t option -> e: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> fields: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed Catala_utils.String.Map.t -> 'm Shared_ast__.Definitions.mark -> ((< syntacticNames : Shared_ast__.Definitions.yes.. > as 'a, < syntacticNames : Shared_ast__.Definitions.yes.. > as 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval edstructaccess : name_opt:Shared_ast__.Definitions.StructName.t option -> field:Catala_utils.String.t -> e: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> 'm Shared_ast__.Definitions.mark -> ((< syntacticNames : Shared_ast__.Definitions.yes.. > as 'a, < syntacticNames : Shared_ast__.Definitions.yes.. > as 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval estructaccess : name:Shared_ast__.Definitions.StructName.t -> field:Shared_ast__.Definitions.StructField.t -> e: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval einj : name:Shared_ast__.Definitions.EnumName.t -> cons:Shared_ast__.Definitions.EnumConstructor.t -> e: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval ematch : name:Shared_ast__.Definitions.EnumName.t -> e: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> cases: (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed Shared_ast__.Definitions.EnumConstructor.Map.t -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval escopecall : scope:Shared_ast__.Definitions.ScopeName.t -> args: (Catala_utils.Pos.t * (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed) Shared_ast__.Definitions.ScopeVar.Map.t -> 'm Shared_ast__.Definitions.mark -> ((< explicitScopes : Shared_ast__.Definitions.yes.. > as 'a, < explicitScopes : Shared_ast__.Definitions.yes.. > as 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval ecustom : Obj.t -> Type.t list -> Type.t -> 'm Shared_ast__.Definitions.mark -> ((< custom : Shared_ast__.Definitions.yes.. >, < custom : Shared_ast__.Definitions.yes.. >, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval fun_id : ?var_name:string -> 'm Shared_ast__.Definitions.mark -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

The type of the mark, if typed, is assumed to correspond to the argument type, not the function type

Manipulation of marks

Sourceval get_attr : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (Catala_utils.Pos.attr -> 'b option) -> 'b option
Sourceval get_attrs : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (Catala_utils.Pos.attr -> 'b option) -> 'b list
Sourceval set_attrs : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (string list Catala_utils.Mark.pos * Shared_ast__.Definitions.attr_value Catala_utils.Mark.pos) list -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval take_attr : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (Catala_utils.Pos.attr -> 'b option) -> 'b option * (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Discards the attributes: useful when copying a mark around.

Sourceval no_attrs : 'm Shared_ast__.Definitions.mark -> 'm Shared_ast__.Definitions.mark

Discards the attributes: useful when copying a mark around.

Sourceval no_mark : 'm Shared_ast__.Definitions.mark -> 'm Shared_ast__.Definitions.mark

Returns an empty mark, using the argument as type witness. Note that the custom part is kept on Custom marks

Sourceval mark_pos : 'm Shared_ast__.Definitions.mark -> Catala_utils.Pos.t
Sourceval with_pos : Catala_utils.Pos.t -> 'm Shared_ast__.Definitions.mark -> 'm Shared_ast__.Definitions.mark
Sourceval with_ty : 'm Shared_ast__.Definitions.mark -> ?pos:Catala_utils.Pos.t -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos -> 'm Shared_ast__.Definitions.mark

Adds the given type information only on typed marks

Sourceval map_ty : (Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos) -> 'm Shared_ast__.Definitions.mark -> 'm Shared_ast__.Definitions.mark

Identity on untyped marks

Sourceval map_mark : (Catala_utils.Pos.t -> Catala_utils.Pos.t) -> (Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos) -> 'm Shared_ast__.Definitions.mark -> 'm Shared_ast__.Definitions.mark
Sourceval map_mark2 : (Catala_utils.Pos.t -> Catala_utils.Pos.t -> Catala_utils.Pos.t) -> (Shared_ast__.Definitions.typed -> Shared_ast__.Definitions.typed -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos) -> 'm Shared_ast__.Definitions.mark -> 'm Shared_ast__.Definitions.mark -> 'm Shared_ast__.Definitions.mark

Raises Invalid_arg on custom marks

Sourceval fold_marks : (Catala_utils.Pos.t list -> Catala_utils.Pos.t) -> (Shared_ast__.Definitions.typed list -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos) -> 'm Shared_ast__.Definitions.mark list -> 'm Shared_ast__.Definitions.mark

Raises Invalid_arg on custom marks

Sourceval maybe_ty : ?typ:Shared_ast__.Definitions.naked_typ -> 'm Shared_ast__.Definitions.mark -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos

Returns the corresponding type on a typed expr, or typ (defaulting to TForAll) at the current position on an untyped one

Sourceval untyped : Shared_ast__.Definitions.untyped Shared_ast__.Definitions.mark

Type witness for untyped marks

Sourceval typed : Shared_ast__.Definitions.typed Shared_ast__.Definitions.mark

Type witness for untyped marks

Predefined types

Sourceval option_enum : Shared_ast__.Definitions.EnumName.t
Sourceval option_struct : Shared_ast__.Definitions.StructName.t

Only used in some backends where enums piggy-back on structs (e.g. C)

Sourceval none_constr : Shared_ast__.Definitions.EnumConstructor.t
Sourceval some_constr : Shared_ast__.Definitions.EnumConstructor.t
Sourceval option_enum_config : Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos Shared_ast__.Definitions.EnumConstructor.Map.t
Sourceval source_pos_struct : Shared_ast__.Definitions.StructName.t

Fake structure (there is no corresponding decl) used for categorising PosLit terms in scalc

Manipulation of marked expressions

Sourceval pos : ('a, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> Catala_utils.Pos.t
Sourceval ty : ('e, Shared_ast__.Definitions.typed Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos
Sourceval set_ty : Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos -> ('a, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> ('a, Shared_ast__.Definitions.typed Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval untype : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, Shared_ast__.Definitions.untyped) Shared_ast__.Definitions.base_gexpr Bindlib.box, Shared_ast__.Definitions.untyped Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Traversal functions

Sourceval map : ?typ: (Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos) -> ?op: ('a Shared_ast__.Definitions.Op.t Catala_utils.Mark.pos -> 'b Shared_ast__.Definitions.Op.t Catala_utils.Mark.pos) -> f: ((('a, 'a, 'm1) Shared_ast__.Definitions.base_gexpr, 'm1 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('b, 'b, 'm2) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm2 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed) -> (('a, 'b, 'm1) Shared_ast__.Definitions.base_gexpr, 'm2 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('b, 'b, 'm2) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm2 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Shallow mapping on expressions (non recursive): applies the given function to all sub-terms of the given expression, and rebuilds the node.

This function makes it very concise to transform only certain nodes of the AST. For instance, if you want to remove all errors on empty, you can write

  let remove_error_empty e =
    let rec f e =
      match Mark.remove e with
      | EErrorOnEmpty e1 -> Expr.map ~f e1
      | _ -> Expr.map ~f e
    in
    f e

This can even be used to translate between different kinds of ASTs: see Lcalc.Compile_without_exceptions for an example. The structure is like this:

  let rec translate = function
    | SpecificCase e -> TargetCase (translate e)
    | (All | Other | Common | Cases) as e -> Expr.map ~f:translate e

The e parameter passed to map here needs to have only the common cases in its shallow type, but can still contain any node from the starting AST deeper inside: this is where the second type parameter to base_gexpr becomes useful.

The typ argument, if specified, will apply a transformation both on type annotations, if present, and on types appearing within the AST nodes.

The op argument must be specified for the EAppOp case to be handled.

Sourceval map_top_down : f: ((('a, 'a, 'm1) Shared_ast__.Definitions.base_gexpr, 'm1 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm1) Shared_ast__.Definitions.base_gexpr, 'm2 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed) -> (('a, 'a, 'm1) Shared_ast__.Definitions.base_gexpr, 'm1 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm2) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm2 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Recursively applies f to the nodes of the expression tree. The type returned by f is hybrid since the mark at top-level has been rewritten, but not yet the marks in the subtrees.

Sourceval map_marks : f:('m1 Shared_ast__.Definitions.mark -> 'm2 Shared_ast__.Definitions.mark) -> (('a, 'a, 'm1) Shared_ast__.Definitions.base_gexpr, 'm1 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm2) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm2 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval shallow_fold : ((('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> 'acc -> 'acc) -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> 'acc -> 'acc

Applies a function on all sub-terms of the given expression. Does not recurse. It opens binders unless you avoid sending binders to the function like the example below. Useful as helper for recursive calls within traversal functions. This can be used to compute free variables with e.g.:

  let rec free_vars = function
    | EVar v, _ -> Var.Set.singleton v
    | EAbs { binder; _ }, _ ->
      let vs, body = Bindlib.unmbind binder in
      Array.fold_right Var.Set.remove vs (free_vars body)
    | e ->
      shallow_fold (fun e -> Var.Set.union (free_vars e)) e Var.Set.empty
Sourceval map_gather : acc:'acc -> join:('acc -> 'acc -> 'acc) -> f: ((('a, 'a, 'm1) Shared_ast__.Definitions.base_gexpr, 'm1 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> 'acc * (('a, 'a, 'm2) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm2 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed) -> (('a, 'a, 'm1) Shared_ast__.Definitions.base_gexpr, 'm2 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> 'acc * (('a, 'a, 'm2) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm2 Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Shallow mapping similar to map, but additionally allows to gather an accumulator bottom-up. acc is the accumulator value returned on terminal nodes, and join is used to merge accumulators from the different sub-terms of an expression. acc is assumed to be a neutral element for join. Typically used with a set of variables used in the rewrite:

  let rec rewrite e =
    match Mark.remove e with
    | Specific_case -> Var.Set.singleton x, some_rewrite_fun e
    | _ ->
      Expr.map_gather ~acc:Var.Set.empty ~join:Var.Set.union ~f:rewrite e

See Lcalc.closure_conversion for a real-world example.

Expression building helpers

Sourceval make_var : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed Var.t -> 'm Shared_ast__.Definitions.mark -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval make_abs : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed Var.var Catala_utils.Mark.pos list -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos list -> Catala_utils.Pos.t -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Warning: assumes no polymorphism, no type variables will be quantified

Sourceval make_ghost_abs : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed Var.var list -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos list -> Catala_utils.Pos.t -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Same as make_abs without binders' positions

Sourceval make_app : (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed list -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos list -> Catala_utils.Pos.t -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval make_puredefault : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> ((< defaultTerms : Shared_ast__.Definitions.yes.. > as 'a, < defaultTerms : Shared_ast__.Definitions.yes.. > as 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval make_pos : Catala_utils.Pos.t -> 'm Shared_ast__.Definitions.mark -> ((< defaultTerms : Shared_ast__.Definitions.no.. > as 'a, < defaultTerms : Shared_ast__.Definitions.no.. > as 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

m is used as type witness, but both position and type are overriden

Sourceval make_erroronempty : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> ((< defaultTerms : Shared_ast__.Definitions.yes.. > as 'a, < defaultTerms : Shared_ast__.Definitions.yes.. > as 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval empty_thunked_term : 'm Shared_ast__.Definitions.mark -> ((< defaultTerms : Shared_ast__.Definitions.yes.. >, < defaultTerms : Shared_ast__.Definitions.yes.. >, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval thunk_term : (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'b) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'b Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'b) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'b Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval unthunk_term_nobox : (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Remove thunking around an expression (this assumes it's the right form, raises Invalid_argument otherwise)

Sourceval make_let_in : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed Var.t Catala_utils.Mark.pos -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> Catala_utils.Pos.t -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval make_multiple_let_in : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed Var.var Catala_utils.Mark.pos list -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos list -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed list -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> Catala_utils.Pos.t -> (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed
Sourceval make_tuple : (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed list -> 'm Shared_ast__.Definitions.mark -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Builds a tuple; the mark argument is only used as witness and for position when building 0-uples

Sourceval make_tupleaccess : (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> int -> int -> Catala_utils.Pos.t -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Transformations

Sourceval skip_wrappers : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Removes surface logging calls and EErrorOnEmpty nodes. Shallow function

Sourceval remove_logging_calls : ((< polymorphic : Shared_ast__.Definitions.yes.. > as 'a, < polymorphic : Shared_ast__.Definitions.yes.. > as 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

Removes all calls to Log unary operators in the AST, replacing them by their argument.

Sourceval detuplify_application : (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed list -> Shared_ast__.Definitions.naked_typ Catala_utils.Mark.pos list -> ((('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed list -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed) -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr Bindlib.box, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed

detyplify_application args arg_typs mkapp reconstructs a function application using mkapp, but transforming args into its individual tuple elements in the case where arg_typs expects multiple arguments but args is a single tuple

Formatting

Sourceval format : Format.formatter -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> unit

Simple printing without debug, use Print.expr () instead to follow the command-line debug setting

Analysis and tests

Sourceval equal_lit : Shared_ast__.Definitions.lit -> Shared_ast__.Definitions.lit -> bool
Sourceval compare_lit : Shared_ast__.Definitions.lit -> Shared_ast__.Definitions.lit -> int
Sourceval equal_location : 'a Shared_ast__.Definitions.glocation Catala_utils.Mark.pos -> 'a Shared_ast__.Definitions.glocation Catala_utils.Mark.pos -> bool
Sourceval compare_location : 'a Shared_ast__.Definitions.glocation Catala_utils.Mark.pos -> 'a Shared_ast__.Definitions.glocation Catala_utils.Mark.pos -> int
Sourceval equal : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> bool

Determines if two expressions are equal, omitting their position information

Sourceval compare : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> int

Standard comparison function, suitable for e.g. Set.Make. Ignores position information

Sourceval is_value : (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> bool
Sourceval free_vars : (('a Shared_ast__.Definitions.any, 'a Shared_ast__.Definitions.any, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed Var.Set.t
Sourceval size : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> int

Used by the optimizer to know when to stop

Sourceval is_pure : (('a, 'a, 'm) Shared_ast__.Definitions.base_gexpr, 'm Shared_ast__.Definitions.mark) Catala_utils.Mark.ed -> bool

If true, the expression is guaranteed not to have any side-effect (logging, possible failure, or debug print)

Sourcemodule Box : sig ... end