81 lines
3.1 KiB
OCaml
81 lines
3.1 KiB
OCaml
(**************************************************************************)
|
|
(* *)
|
|
(* OCaml *)
|
|
(* *)
|
|
(* Pierre Chambart, OCamlPro *)
|
|
(* Mark Shinwell and Leo White, Jane Street Europe *)
|
|
(* *)
|
|
(* Copyright 2013--2016 OCamlPro SAS *)
|
|
(* Copyright 2014--2016 Jane Street Group LLC *)
|
|
(* *)
|
|
(* All rights reserved. This file is distributed under the terms of *)
|
|
(* the GNU Lesser General Public License version 2.1, with the *)
|
|
(* special exception on linking described in the file LICENSE. *)
|
|
(* *)
|
|
(**************************************************************************)
|
|
|
|
(** Representation of projections from closures and blocks. *)
|
|
|
|
(** 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 project_closure = {
|
|
set_of_closures : Variable.t; (** must yield a set of closures *)
|
|
closure_id : 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 move_within_set_of_closures = {
|
|
closure : Variable.t; (** must yield a closure *)
|
|
start_from : Closure_id.t;
|
|
move_to : Closure_id.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]. *)
|
|
type project_var = {
|
|
closure : Variable.t; (** must yield a closure *)
|
|
closure_id : Closure_id.t;
|
|
var : Var_within_closure.t;
|
|
}
|
|
|
|
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 =
|
|
| Project_var of project_var
|
|
| Project_closure of project_closure
|
|
| Move_within_set_of_closures of move_within_set_of_closures
|
|
| Field of int * Variable.t
|
|
|
|
include Identifiable.S with type t := t
|
|
|
|
(** Return which variable the given projection projects from. *)
|
|
val projecting_from : t -> Variable.t
|
|
|
|
(** Change the variable that the given projection projects from. *)
|
|
val map_projecting_from : t -> f:(Variable.t -> Variable.t) -> t
|