signature SYMBOL = sig eqtype symbol val symbol : string -> symbol val name : symbol -> string type 'a table val empty : 'a table val enter : 'a table * symbol * 'a -> 'a table val look : 'a table * symbol -> 'a option end abstraction Symbol : SYMBOL = struct type symbol = string * int structure T = HashTable(struct type hash_key = string val hashVal = HashString.hashString fun sameKey(s1,s2) = s1=s2 end) exception Symbol val nextsym = ref 0 val hashtable : int T.hash_table = T.mkTable(128,Symbol) fun symbol name = case T.peek hashtable name of SOME i => (name,i) | NONE => let val i = !nextsym in nextsym := i+1; T.insert hashtable (name,i); (name,i) end fun name(s,n) = s structure Table = IntMapTable(type key = symbol fun getInt(s,n) = n) type 'a table= 'a Table.table val empty = Table.empty val enter = Table.enter val look = Table.look end