equal
deleted
inserted
replaced
26 val names: context -> string -> 'a list -> (string * 'a) list |
26 val names: context -> string -> 'a list -> (string * 'a) list |
27 val invent_list: string list -> string -> int -> string list |
27 val invent_list: string list -> string -> int -> string list |
28 val variants: string list -> context -> string list * context |
28 val variants: string list -> context -> string list * context |
29 val variant_list: string list -> string list -> string list |
29 val variant_list: string list -> string list -> string list |
30 val variant: string list -> string -> string |
30 val variant: string list -> string -> string |
|
31 val desymbolize: string -> string |
31 end; |
32 end; |
32 |
33 |
33 structure Name: NAME = |
34 structure Name: NAME = |
34 struct |
35 struct |
35 |
36 |
142 in (x' ^ replicate_string n "_", ctxt') end); |
143 in (x' ^ replicate_string n "_", ctxt') end); |
143 |
144 |
144 fun variant_list used names = #1 (make_context used |> variants names); |
145 fun variant_list used names = #1 (make_context used |> variants names); |
145 fun variant used = singleton (variant_list used); |
146 fun variant used = singleton (variant_list used); |
146 |
147 |
|
148 |
|
149 (* names conforming to typical requirements of identifiers in the outside world *) |
|
150 |
|
151 fun desymbolize "" = "x" |
|
152 | desymbolize s = |
|
153 let |
|
154 val xs = Symbol.explode s; |
|
155 val ys = if Symbol.is_ascii_letter (hd xs) then xs |
|
156 else "x" :: xs; |
|
157 fun is_valid x = |
|
158 Symbol.is_ascii_letter x orelse Symbol.is_ascii_digit x orelse x = "'"; |
|
159 fun sep [] = [] |
|
160 | sep (xs as "_" :: _) = xs |
|
161 | sep xs = "_" :: xs; |
|
162 fun desymb x xs = if is_valid x |
|
163 then x :: xs |
|
164 else if Symbol.is_symbolic x |
|
165 then "_" :: Symbol.name_of x :: sep xs |
|
166 else |
|
167 sep xs |
|
168 in implode (fold_rev desymb ys []) end; |
|
169 |
147 end; |
170 end; |