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