; symbol : int
}
-let nextsym = ref 0
+let counter = ref 0
let symbols = H.create 16
+let next name =
+ incr counter;
+ let symbol = !counter in
+ {name; symbol}
+
+let new_of_string name =
+ let t = next name in
+ H.replace symbols ~key:t.name ~data:t.symbol;
+ t
+
let of_string name =
match H.find_opt symbols name with
- | Some symbol ->
- {name; symbol}
- | None ->
- incr nextsym;
- let symbol = !nextsym in
- H.replace symbols ~key:name ~data:symbol;
- {name; symbol}
+ | Some s -> {name; symbol=s}
+ | None -> new_of_string name
let to_string {name; _} =
name
let is_equal {symbol=s1; _} {symbol=s2; _} =
s1 = s2
+
+let show {name; symbol} =
+ Printf.sprintf "Symbol[%S, %d]" name symbol