# HG changeset patch # User haftmann # Date 1153485925 -7200 # Node ID c057b3618963e46c72f235a40fed4bb704303cef # Parent c8f791af9a604c9bfbb91bc729b274e7091a60c3 added give_names and alphanum diff -r c8f791af9a60 -r c057b3618963 src/Pure/name.ML --- a/src/Pure/name.ML Fri Jul 21 14:11:14 2006 +0200 +++ b/src/Pure/name.ML Fri Jul 21 14:45:25 2006 +0200 @@ -21,10 +21,12 @@ val declare: string -> context -> context val is_declared: context -> string -> bool val invents: context -> string -> int -> string list + val give_names: context -> string -> 'a list -> (string * 'a) list val invent_list: string list -> string -> int -> string list val variants: string list -> context -> string list * context val variant_list: string list -> string list -> string list val variant: string list -> string -> string + val alphanum: string -> string end; structure Name: NAME = @@ -99,6 +101,7 @@ in invs o clean end; val invent_list = invents o make_context; +fun give_names ctxt x xs = invents ctxt x (length xs) ~~ xs; (* variants *) @@ -128,4 +131,24 @@ fun variant_list used names = #1 (make_context used |> variants names); fun variant used = singleton (variant_list used); + +(*turning arbitrary names into alphanumerics*) + +fun alphanum s = + let + fun replace_invalid c (last_inv, cs) = + if ((Char.isAlphaNum o the o Char.fromString) c orelse c = "'") + andalso not (NameSpace.separator = c) + then (false, if last_inv then c :: "_" :: cs else c :: cs) + else (true, cs); + fun prefix_num_empty [] = ["x"] + | prefix_num_empty (cs as c::_) = + if (Char.isDigit o the o Char.fromString) c + then "x" :: cs + else cs; + val (prefix, cs1) = case explode s of "'"::cs => ("'", cs) | cs => ("", cs); + val (_, cs2) = fold_rev replace_invalid cs1 (false, []); + val cs3 = prefix_num_empty cs2; + in implode (prefix :: cs3) end; + end;