@@ -63,8 +63,6 @@ module Var : sig
6363
6464 val of_idx : int -> t
6565
66- val to_string : ?origin : t -> t -> string
67-
6866 val fresh : unit -> t
6967
7068 val fresh_n : string -> t
@@ -75,18 +73,14 @@ module Var : sig
7573
7674 val compare : t -> t -> int
7775
78- val name : t -> string -> unit
76+ val set_name : t -> string -> unit
7977
8078 val get_name : t -> string option
8179
8280 val propagate_name : t -> t -> unit
8381
8482 val reset : unit -> unit
8583
86- val set_pretty : bool -> unit
87-
88- val set_stable : bool -> unit
89-
9084 module Set : Set .S with type elt = t
9185
9286 module Map : Map .S with type key = t
@@ -155,27 +149,106 @@ end = struct
155149
156150 let printer = Var_printer. create Var_printer.Alphabet. javascript
157151
152+ module Name = struct
153+ let names = Hashtbl. create 100
154+
155+ let reset () = Hashtbl. clear names
156+
157+ let reserved = Hashtbl. create 100
158+
159+ let () = StringSet. iter (fun s -> Hashtbl. add reserved s () ) Reserved. keyword
160+
161+ let is_reserved s = Hashtbl. mem reserved s
162+
163+ let merge n1 n2 =
164+ match n1, n2 with
165+ | "" , n2 -> n2
166+ | n1 , "" -> n1
167+ | n1 , n2 ->
168+ if generated_name n1
169+ then n2
170+ else if generated_name n2
171+ then n1
172+ else if String. length n1 > String. length n2
173+ then n1
174+ else n2
175+
176+ let set_raw v nm = Hashtbl. replace names v nm
177+
178+ let propagate v v' =
179+ try
180+ let name = Hashtbl. find names v in
181+ match Hashtbl. find names v' with
182+ | exception Not_found -> set_raw v' name
183+ | name' -> set_raw v' (merge name name')
184+ with Not_found -> ()
185+
186+ let set v nm_orig =
187+ let len = String. length nm_orig in
188+ if len > 0
189+ then (
190+ let buf = Buffer. create (String. length nm_orig) in
191+ let idx = ref 0 in
192+ while ! idx < len && not (Char. is_letter nm_orig.[! idx]) do
193+ incr idx
194+ done ;
195+ let pending = ref false in
196+ if ! idx > = len
197+ then (
198+ pending := true ;
199+ idx := 0 );
200+ for i = ! idx to len - 1 do
201+ if Char. is_letter nm_orig.[i] || Char. is_digit nm_orig.[i]
202+ then (
203+ if ! pending then Buffer. add_char buf '_' ;
204+ Buffer. add_char buf nm_orig.[i];
205+ pending := false )
206+ else pending := true
207+ done ;
208+ let str = Buffer. contents buf in
209+ let str =
210+ match str, nm_orig with
211+ | "" , ">>=" -> " symbol_bind"
212+ | "" , ">>|" -> " symbol_map"
213+ | "" , "^" -> " symbol_concat"
214+ | "" , _ -> " symbol"
215+ | str , _ -> if is_reserved str then str ^ " $" else str
216+ in
217+ (* protect against large names *)
218+ let max_len = 30 in
219+ let str =
220+ if String. length str > max_len then String. sub str ~pos: 0 ~len: max_len else str
221+ in
222+ set_raw v str)
223+
224+ let get v = try Some (Hashtbl. find names v) with Not_found -> None
225+ end
226+
158227 let last_var = ref 0
159228
160229 let reset () =
161230 last_var := 0 ;
162- Var_printer. reset printer
163-
164- let to_string ?origin i = Var_printer. to_string printer ?origin i
165-
166- let print f x = Format. fprintf f " v%d" x
231+ Var_printer. reset printer;
232+ Name. reset ()
167233
168- (* Format.fprintf f "%s" (to_string x) *)
234+ let print f x =
235+ Format. fprintf
236+ f
237+ " v%d%s"
238+ x
239+ (match Name. get x with
240+ | None -> " "
241+ | Some nm -> " {" ^ nm ^ " }" )
169242
170- let name i nm = Var_printer. name printer i nm
243+ let set_name i nm = Name. set i nm
171244
172245 let fresh () =
173246 incr last_var;
174247 ! last_var
175248
176249 let fresh_n nm =
177250 incr last_var;
178- name ! last_var nm;
251+ set_name ! last_var nm;
179252 ! last_var
180253
181254 let count () = ! last_var + 1
@@ -184,13 +257,9 @@ end = struct
184257
185258 let of_idx v = v
186259
187- let get_name i = Var_printer. get_name printer i
188-
189- let propagate_name i j = Var_printer. propagate_name printer i j
190-
191- let set_pretty b = Var_printer. set_pretty printer b
260+ let get_name i = Name. get i
192261
193- let set_stable b = Var_printer. set_stable printer b
262+ let propagate_name i j = Name. propagate i j
194263
195264 let fork o =
196265 let n = fresh () in
0 commit comments