src/Pure/library.ML
changeset 47022 8eac39af4ec0
parent 46891 af4c1dd3963f
child 47023 c7a89ecbc71e
equal deleted inserted replaced
47021:f35f654f297d 47022:8eac39af4ec0
   211   val divide_and_conquer: ('a -> 'a list * ('b list -> 'b)) -> 'a -> 'b
   211   val divide_and_conquer: ('a -> 'a list * ('b list -> 'b)) -> 'a -> 'b
   212   val divide_and_conquer': ('a -> 'b -> ('a list * ('c list * 'b -> 'c * 'b)) * 'b) ->
   212   val divide_and_conquer': ('a -> 'b -> ('a list * ('c list * 'b -> 'c * 'b)) * 'b) ->
   213     'a -> 'b -> 'c * 'b
   213     'a -> 'b -> 'c * 'b
   214   val partition_eq: ('a * 'a -> bool) -> 'a list -> 'a list list
   214   val partition_eq: ('a * 'a -> bool) -> 'a list -> 'a list list
   215   val partition_list: (int -> 'a -> bool) -> int -> int -> 'a list -> 'a list list
   215   val partition_list: (int -> 'a -> bool) -> int -> int -> 'a list -> 'a list list
   216   val legacy_gensym: string -> string
       
   217   type serial = int
   216   type serial = int
   218   val serial: unit -> serial
   217   val serial: unit -> serial
   219   val serial_string: unit -> string
   218   val serial_string: unit -> string
   220   eqtype stamp
   219   eqtype stamp
   221   val stamp: unit -> stamp
   220   val stamp: unit -> stamp
  1041           let val (xs, xs') = List.partition (fn y => eq (x, y)) ys
  1040           let val (xs, xs') = List.partition (fn y => eq (x, y)) ys
  1042           in (x :: xs) :: part xs' end;
  1041           in (x :: xs) :: part xs' end;
  1043   in part end;
  1042   in part end;
  1044 
  1043 
  1045 
  1044 
  1046 
       
  1047 (* generating identifiers -- often fresh *)
       
  1048 
       
  1049 local
       
  1050 (*Maps 0-61 to A-Z, a-z, 0-9; exclude _ or ' to avoid clash with internal/unusual indentifiers*)
       
  1051 fun gensym_char i =
       
  1052   if i<26 then chr (ord "A" + i)
       
  1053   else if i<52 then chr (ord "a" + i - 26)
       
  1054   else chr (ord "0" + i - 52);
       
  1055 
       
  1056 val char_vec = Vector.tabulate (62, gensym_char);
       
  1057 fun newid n = implode (map (fn i => Vector.sub (char_vec, i)) (radixpand (62, n)));
       
  1058 
       
  1059 val gensym_seed = Unsynchronized.ref (0: int);
       
  1060 
       
  1061 in
       
  1062   fun legacy_gensym pre =
       
  1063     pre ^ newid (NAMED_CRITICAL "legacy_gensym" (fn () => Unsynchronized.inc gensym_seed));
       
  1064 end;
       
  1065 
       
  1066 
       
  1067 (* serial numbers and abstract stamps *)
  1045 (* serial numbers and abstract stamps *)
  1068 
  1046 
  1069 type serial = int;
  1047 type serial = int;
  1070 val serial = Multithreading.serial;
  1048 val serial = Multithreading.serial;
  1071 val serial_string = string_of_int o serial;
  1049 val serial_string = string_of_int o serial;