Ident
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 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
. 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 output : out_channel -> T.t -> unit
val print : Stdlib.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 print_with_scope : Stdlib.Format.formatter -> t -> unit
Same as print
except that it will also add a "n
" suffix if the scope of the argument is n
.
val create_scoped : scope:int -> string -> t
val create_local : string -> t
val create_persistent : string -> t
val create_predef : string -> t
Creates an identifier with the same name as the input, a fresh stamp, and no scope.
val name : t -> string
val unique_name : t -> string
val unique_toplevel_name : t -> string
val persistent : t -> bool
Compare identifiers by binding location. Two identifiers are the same either if they are both non-persistent and have been created by the same call to create_*
, or if they are both persistent and have the same name.
val global : t -> bool
val is_predef : t -> bool
val scope : t -> int
'a tbl
represents association tables from identifiers to values of type 'a
.
'a tbl
plays the role of map, but bindings can be looked up from either the full Ident using find_same
, or just its user-visible name using find_name
. In general the two lookups may not return the same result, as an identifier may have been shadowed in the environment by a distinct identifier with the same name.
find_all
returns the bindings for all idents of a given name, most recently introduced first.
In other words, 'a tbl
corresponds to (Ident.t * 'a) list Map.Make(String)
and the implementation is very close to that representation.
Note in particular that searching among idents of the same name takes linear time, and that add
simply extends the list without checking for duplicates. So it is not a good idea to implement union by repeated add
calls, which may result in many duplicated identifiers and poor find_same
performance. It is even possible to build overly large same-name lists such that non-recursive functions like find_all
or fold_all
blow the stack.
You should probably use Map.Make(Ident)
instead, unless you really need to query bindings by user-visible name, not just by unique identifiers.
val empty : 'a tbl
val find_all_seq : string -> 'a tbl -> (t * 'a) Stdlib.Seq.t