File: symbol.sml

package info (click to toggle)
mlton 20210117%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 58,464 kB
  • sloc: ansic: 27,682; sh: 4,455; asm: 3,569; lisp: 2,879; makefile: 2,347; perl: 1,169; python: 191; pascal: 68; javascript: 7
file content (27 lines) | stat: -rw-r--r-- 761 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
structure UniqueSymbol :> UNIQUE_SYMBOL =
struct

   structure H = HashTable

   datatype symbol = SYMBOL of string ref * word

   fun equal(SYMBOL(a,_),SYMBOL(b,_)) = a = b
   fun compare(SYMBOL(a,_),SYMBOL(b,_)) = String.compare(!a,!b)
   fun hash(SYMBOL(_,w)) = w
   fun toString(SYMBOL(s,_)) = !s

   exception NotThere

   fun hashIt(SYMBOL(ref s,_)) = HashString.hashString s
   fun eq(SYMBOL(ref x,a),SYMBOL(ref y,b)) = a = b andalso x = y

   val table = H.mkTable (hashIt,eq) (117,NotThere) 
                  : (symbol,symbol) H.hash_table

   val lookup = H.lookup table
   val insert = H.insert table

   fun fromString name = 
       let val s = SYMBOL(ref name,HashString.hashString name) 
       in  lookup s handle _ => (insert(s,s); s) end
end