Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Atd.ExpandSourceMonomorphization of type definitions
val expand_type_defs :
?prefix:string ->
?keep_builtins:bool ->
?keep_poly:bool ->
?debug:bool ->
Ast.type_def list ->
Ast.type_def listMonomorphization of type expressions.
The goal is to inline each parametrized type definition as much as possible, allowing code generators to create more efficient code directly:
type ('a, 'b) t = [ Foo of 'a | Bar of 'b ]
type int_t = (int, int) tbecomes:
type int_t = _1 type _1 = [ Foo of int | Bar of int ]
A secondary goal is to factor out type subexpressions in order for the code generators to produce less code:
type x = \{ x : int list }
type y = \{ y : int list option }becomes:
type x = \{ x : _1 }
type y = \{ y : _2 }
type _1 = int list (* `int list' now occurs only once *)
type _2 = _1 optionBy default, only parameterless type definitions are returned. The keep_poly option allows to return parametrized type definitions as well.
Input:
type 'a abs = abstract
type int_abs = int abs
type 'a tree = [ Leaf of 'a | Node of ('a tree * 'a tree) ]
type t = int tree
type x = [ Foo | Bar ] treeOutput (pseudo-syntax where quoted strings indicate unique type identifiers):
type "int abs" = int abs
type int_abs = "int abs"
type 'a tree = [ Leaf of 'a | Node of ('a tree * 'a tree) ]
(* only if keep_poly = true *)
type "int tree" = [ Leaf of int | Node of ("int tree" * "int tree") ]
type t = "int tree"
type "[ Foo | Bar ] tree" =
[ Leaf of [ Foo | Bar ]
| Node of ("[ Foo | Bar ] tree" * "[ Foo | Bar ] tree") ]
type x = "[ Foo | Bar ] tree"