equal
deleted
inserted
replaced
15 val append: string -> string -> string |
15 val append: string -> string -> string |
16 val unpack: string -> string list |
16 val unpack: string -> string list |
17 val pack: string list -> string |
17 val pack: string list -> string |
18 val base: string -> string |
18 val base: string -> string |
19 val qualified: string -> bool |
19 val qualified: string -> bool |
|
20 val accesses: string -> string list |
20 type T |
21 type T |
21 val empty: T |
22 val empty: T |
22 val extend: T * string list -> T |
23 val extend: T * string list -> T |
23 val merge: T * T -> T |
24 val merge: T * T -> T |
24 val intern: T -> string -> string |
25 val intern: T -> string -> string |
55 let |
56 let |
56 val uname = unpack name; |
57 val uname = unpack name; |
57 val (q, b) = split_last uname; |
58 val (q, b) = split_last uname; |
58 val sfxs = suffixes1 uname; |
59 val sfxs = suffixes1 uname; |
59 val pfxs = map (fn x => x @ [b]) (prefixes1 q); |
60 val pfxs = map (fn x => x @ [b]) (prefixes1 q); |
60 in |
61 in map pack (sfxs @ pfxs) end; |
61 map (rpair name o pack) (sfxs @ pfxs) |
|
62 end; |
|
63 |
62 |
64 |
63 |
65 |
64 |
66 (** name spaces **) |
65 (** name spaces **) |
67 |
66 |
76 (* extend, merge operations *) |
75 (* extend, merge operations *) |
77 |
76 |
78 fun add (tab, entry) = Symtab.update (entry, tab); |
77 fun add (tab, entry) = Symtab.update (entry, tab); |
79 |
78 |
80 fun extend (NameSpace tab, names) = |
79 fun extend (NameSpace tab, names) = |
81 NameSpace (foldl add (tab, flat (map accesses names))); |
80 NameSpace (foldl add (tab, flat (map (fn name => map (rpair name) (accesses name)) names))); |
82 |
81 |
83 fun merge (NameSpace tab1, NameSpace tab2) = (*2nd overrides 1st*) |
82 fun merge (NameSpace tab1, NameSpace tab2) = (*2nd overrides 1st*) |
84 NameSpace (foldl add (tab1, Symtab.dest tab2)); |
83 NameSpace (foldl add (tab1, Symtab.dest tab2)); |
85 |
84 |
86 |
85 |