src/Pure/name.ML
changeset 20174 c057b3618963
parent 20158 b71f4f4c6b1e
child 20192 956cd30ef3be
equal deleted inserted replaced
20173:c8f791af9a60 20174:c057b3618963
    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;