1signature SYMBOL =
2sig
3  eqtype symbol
4  val newSymbol : string -> symbol
5  val name : symbol -> string
6  val index : symbol -> int
7  val mkSymbol : string -> int -> symbol
8  type 'a table
9  val empty : 'a table
10  val enter : 'a table * symbol * 'a -> 'a table
11  val look  : 'a table * symbol -> 'a
12end
13
14structure Symbol :> SYMBOL =
15struct
16
17  type symbol = string * int
18
19  structure H = Polyhash
20
21  exception Symbol
22  val nextsym = ref 0
23  val sizeHint = 128
24  val hashtable : (string,int) H.hash_table =
25                H.mkTable(H.hash, op = ) (sizeHint,Symbol)
26
27  fun newSymbol name =
28      case H.peek hashtable name
29       of SOME i => (name,i)
30        | NONE => let val i = !nextsym
31                   in nextsym := i+1;
32                      H.insert hashtable (name,i);
33                      (name,i)
34                  end
35  fun mkSymbol name index =
36        (name,index) : symbol
37
38  fun name(s,n) = s
39  fun index(s,n) = n
40
41  structure Table = IntMapTable(type key = symbol
42                                fun getInt(s,n) = n)
43
44  type 'a table= 'a Table.table
45  val empty = Table.empty
46  val enter = Table.enter
47  val look = Table.look
48end
49