aboutsummaryrefslogtreecommitdiffhomepage
path: root/interp/reserve.ml
diff options
context:
space:
mode:
authorGravatar Pierre-Marie Pédrot <pierre-marie.pedrot@inria.fr>2014-03-01 18:24:16 +0100
committerGravatar Pierre-Marie Pédrot <pierre-marie.pedrot@inria.fr>2014-03-01 19:50:14 +0100
commitbca756eaebf16b6145c65b53629219d2a0a8b1ba (patch)
treeef95ccc25c75c7d173af5bf10c2de2d397f875c7 /interp/reserve.ml
parent4cddb7d0765a091c6514a85475dcdd7af34aaf29 (diff)
Better behaviour for sets of reserved names.
Diffstat (limited to 'interp/reserve.ml')
-rw-r--r--interp/reserve.ml34
1 files changed, 26 insertions, 8 deletions
diff --git a/interp/reserve.ml b/interp/reserve.ml
index 744cf616c..6674a8323 100644
--- a/interp/reserve.ml
+++ b/interp/reserve.ml
@@ -34,13 +34,32 @@ let key_compare k1 k2 = match k1, k2 with
module KeyOrd = struct type t = key let compare = key_compare end
module KeyMap = Map.Make(KeyOrd)
-module ReservedOrd =
+module ReservedSet :
+sig
+ type t
+ val empty : t
+ val add : (Id.t * notation_constr) -> t -> t
+ val find : (Id.t -> notation_constr -> bool) -> t -> Id.t * notation_constr
+end =
struct
- type t = notation_constr * Id.t
- let compare = Pervasives.compare (* FIXME *)
+ type t = (Id.t * notation_constr) list
+
+ let empty = []
+
+ let rec mem id c = function
+ | [] -> false
+ | (id', c') :: l ->
+ if c == c' && Id.equal id id' then true else mem id c l
+
+ let add p l =
+ let (id, c) = p in
+ if mem id c l then l else p :: l
+
+ let rec find f = function
+ | [] -> raise Not_found
+ | (id, c) as p :: l -> if f id c then p else find f l
end
-module ReservedSet = Set.Make(ReservedOrd)
let keymap_add key data map =
let old = try KeyMap.find key map with Not_found -> ReservedSet.empty in
@@ -59,7 +78,7 @@ let notation_constr_key = function (* Rem: NApp(NRef ref,[]) stands for @ref *)
let cache_reserved_type (_,(id,t)) =
let key = fst (notation_constr_key t) in
reserve_table := Id.Map.add id t !reserve_table;
- reserve_revtable := keymap_add key (t,id) !reserve_revtable
+ reserve_revtable := keymap_add key (id, t) !reserve_revtable
let in_reserved : Id.t * notation_constr -> obj =
declare_object {(default_object "RESERVED-TYPE") with
@@ -92,14 +111,13 @@ let revert_reserved_type t =
let t = Detyping.detype false [] [] t in
(* pedrot: if [Notation_ops.match_notation_constr] may raise [Failure _]
then I've introduced a bug... *)
- let filter (pat, id) =
+ let filter _ pat =
try
let _ = match_notation_constr false t ([], pat) in
true
with No_match -> false
in
- let reserved = ReservedSet.filter filter reserved in
- let (_, id) = ReservedSet.choose reserved in
+ let (id, _) = ReservedSet.find filter reserved in
Name id
with Not_found | Failure _ -> Anonymous