Module Projection

Representation of projections from closures and blocks.

type project_closure = {
  1. set_of_closures : Variable.t;
    (*

    must yield a set of closures

    *)
  2. closure_id : Closure_id.t;
}

The selection of one closure given a set of closures, required before a function defined by said set of closures can be applied. See more detailed documentation below on set_of_closures.

type move_within_set_of_closures = {
  1. closure : Variable.t;
    (*

    must yield a closure

    *)
  2. start_from : Closure_id.t;
  3. move_to : Closure_id.t;
}

The selection of one closure given another closure in the same set of closures. See more detailed documentation below on set_of_closures. The move_to closure must be part of the free variables of start_from.

type project_var = {
  1. closure : Variable.t;
    (*

    must yield a closure

    *)
  2. closure_id : Closure_id.t;
  3. var : Var_within_closure.t;
}

The selection from a closure of a variable bound by said closure. In other words, access to a function's environment. Also see more detailed documentation below on set_of_closures.

val print_project_closure : Format.formatter -> project_closure -> unit
val print_move_within_set_of_closures : Format.formatter -> move_within_set_of_closures -> unit
val print_project_var : Format.formatter -> project_var -> unit
val compare_project_var : project_var -> project_var -> int
val compare_project_closure : project_closure -> project_closure -> int
val compare_move_within_set_of_closures : move_within_set_of_closures -> move_within_set_of_closures -> int
type t =
  1. | Project_var of project_var
  2. | Project_closure of project_closure
  3. | Move_within_set_of_closures of move_within_set_of_closures
  4. | Field of int * Variable.t
include Identifiable.S with type t := t
module T : Identifiable.Thing with type t = t
include Identifiable.Thing with type t := T.t
include Hashtbl.HashedType with type t := T.t
val equal : T.t -> T.t -> bool

The equality predicate used to compare keys.

val hash : T.t -> int

A hashing function on keys. It must be such that if two keys are equal according to equal, then they have identical hash values as computed by hash.

The hash value of a key should remain constant as long as the key is in the table. In particular, if the hash function depends on mutable key data, then that data must not be mutated while the key is in the table. Similarly, as the hash function may be called while the table itself is being modified, it should avoid accessing the table as part of its computation.

Examples: suitable (equal, hash) pairs for arbitrary key types include

  • ((=), hash) for comparing objects by structure (provided objects do not contain floats)
  • ((fun x y -> compare x y = 0), hash) for comparing objects by structure and handling Stdlib.nan correctly
  • ((==), hash) for comparing objects by physical equality (e.g. for mutable or cyclic objects).
include Map.OrderedType with type t := T.t
val compare : T.t -> T.t -> int

A total ordering function over the keys. This is a two-argument function f such that f e1 e2 is zero if the keys e1 and e2 are equal, f e1 e2 is strictly negative if e1 is smaller than e2, and f e1 e2 is strictly positive if e1 is greater than e2. Example: a suitable ordering function is the generic structural comparison function Stdlib.compare.

val output : out_channel -> T.t -> unit
val print : Format.formatter -> T.t -> unit
module Set : Identifiable.Set with module T := T
module Map : Identifiable.Map with module T := T
module Tbl : Identifiable.Tbl with module T := T
val projecting_from : t -> Variable.t

Return which variable the given projection projects from.

val map_projecting_from : t -> f:(Variable.t -> Variable.t) -> t

Change the variable that the given projection projects from.