added give_names and alphanum
authorhaftmann
Fri, 21 Jul 2006 14:45:25 +0200
changeset 20174 c057b3618963
parent 20173 c8f791af9a60
child 20175 0a8ca32f6e64
added give_names and alphanum
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;