equal
deleted
inserted
replaced
19 val context: context |
19 val context: context |
20 val make_context: string list -> context |
20 val make_context: string list -> context |
21 val declare: string -> context -> context |
21 val declare: string -> context -> context |
22 val is_declared: context -> string -> bool |
22 val is_declared: context -> string -> bool |
23 val invents: context -> string -> int -> string list |
23 val invents: context -> string -> int -> string list |
|
24 val give_names: context -> string -> 'a list -> (string * 'a) list |
24 val invent_list: string list -> string -> int -> string list |
25 val invent_list: string list -> string -> int -> string list |
25 val variants: string list -> context -> string list * context |
26 val variants: string list -> context -> string list * context |
26 val variant_list: string list -> string list -> string list |
27 val variant_list: string list -> string list -> string list |
27 val variant: string list -> string -> string |
28 val variant: string list -> string -> string |
|
29 val alphanum: string -> string |
28 end; |
30 end; |
29 |
31 |
30 structure Name: NAME = |
32 structure Name: NAME = |
31 struct |
33 struct |
32 |
34 |
97 else x :: invs x' (n - 1) |
99 else x :: invs x' (n - 1) |
98 end; |
100 end; |
99 in invs o clean end; |
101 in invs o clean end; |
100 |
102 |
101 val invent_list = invents o make_context; |
103 val invent_list = invents o make_context; |
|
104 fun give_names ctxt x xs = invents ctxt x (length xs) ~~ xs; |
102 |
105 |
103 |
106 |
104 (* variants *) |
107 (* variants *) |
105 |
108 |
106 (*makes a variant of a name distinct from already used names in a |
109 (*makes a variant of a name distinct from already used names in a |
126 in (x' ^ replicate_string n "_", ctxt') end); |
129 in (x' ^ replicate_string n "_", ctxt') end); |
127 |
130 |
128 fun variant_list used names = #1 (make_context used |> variants names); |
131 fun variant_list used names = #1 (make_context used |> variants names); |
129 fun variant used = singleton (variant_list used); |
132 fun variant used = singleton (variant_list used); |
130 |
133 |
|
134 |
|
135 (*turning arbitrary names into alphanumerics*) |
|
136 |
|
137 fun alphanum s = |
|
138 let |
|
139 fun replace_invalid c (last_inv, cs) = |
|
140 if ((Char.isAlphaNum o the o Char.fromString) c orelse c = "'") |
|
141 andalso not (NameSpace.separator = c) |
|
142 then (false, if last_inv then c :: "_" :: cs else c :: cs) |
|
143 else (true, cs); |
|
144 fun prefix_num_empty [] = ["x"] |
|
145 | prefix_num_empty (cs as c::_) = |
|
146 if (Char.isDigit o the o Char.fromString) c |
|
147 then "x" :: cs |
|
148 else cs; |
|
149 val (prefix, cs1) = case explode s of "'"::cs => ("'", cs) | cs => ("", cs); |
|
150 val (_, cs2) = fold_rev replace_invalid cs1 (false, []); |
|
151 val cs3 = prefix_num_empty cs2; |
|
152 in implode (prefix :: cs3) end; |
|
153 |
131 end; |
154 end; |