src/Pure/name.ML
changeset 31013 69a476d6fea6
parent 30584 7e839627b9e7
child 31035 de0a20a030fd
equal deleted inserted replaced
31012:751f5aa3e315 31013:69a476d6fea6
    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;