src/Pure/data.ML
author oheimb
Wed, 12 Nov 1997 18:58:50 +0100
changeset 4223 f60e3d2c81d3
parent 4124 1af16493c57f
permissions -rw-r--r--
added thin_refl to hyp_subst_tac
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/data.ML
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
     4
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
     5
Arbitrarily typed data.  Fools the ML type system via exception
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
     6
constructors.
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
     7
*)
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
     8
4124
1af16493c57f type object = exn (enhance readability);
wenzelm
parents: 4074
diff changeset
     9
type object = exn;
1af16493c57f type object = exn (enhance readability);
wenzelm
parents: 4074
diff changeset
    10
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    11
signature DATA =
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    12
sig
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    13
  type T
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    14
  val empty: T
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    15
  val merge: T * T -> T
3872
wenzelm
parents: 3863
diff changeset
    16
  val prep_ext: T -> T
wenzelm
parents: 3863
diff changeset
    17
  val kinds: T -> string list
4124
1af16493c57f type object = exn (enhance readability);
wenzelm
parents: 4074
diff changeset
    18
  val init: T -> string -> object ->
1af16493c57f type object = exn (enhance readability);
wenzelm
parents: 4074
diff changeset
    19
    (object -> object) -> (object * object -> object) -> (object -> unit) -> T
1af16493c57f type object = exn (enhance readability);
wenzelm
parents: 4074
diff changeset
    20
  val get: T -> string -> object
1af16493c57f type object = exn (enhance readability);
wenzelm
parents: 4074
diff changeset
    21
  val put: T -> string -> object -> T
3872
wenzelm
parents: 3863
diff changeset
    22
  val print: T -> string -> unit
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    23
end;
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    24
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    25
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    26
structure Data: DATA =
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    27
struct
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    28
3872
wenzelm
parents: 3863
diff changeset
    29
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    30
(* datatype T *)
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    31
3872
wenzelm
parents: 3863
diff changeset
    32
datatype T = Data of
4124
1af16493c57f type object = exn (enhance readability);
wenzelm
parents: 4074
diff changeset
    33
  (object *                             (*value*)
1af16493c57f type object = exn (enhance readability);
wenzelm
parents: 4074
diff changeset
    34
   ((object -> object) *                (*prepare extend method*)
1af16493c57f type object = exn (enhance readability);
wenzelm
parents: 4074
diff changeset
    35
    (object * object -> object) *       (*merge and prepare extend method*)
1af16493c57f type object = exn (enhance readability);
wenzelm
parents: 4074
diff changeset
    36
    (object -> unit)))                  (*print method*)
3872
wenzelm
parents: 3863
diff changeset
    37
  Symtab.table;
wenzelm
parents: 3863
diff changeset
    38
wenzelm
parents: 3863
diff changeset
    39
val empty = Data Symtab.null;
wenzelm
parents: 3863
diff changeset
    40
wenzelm
parents: 3863
diff changeset
    41
fun kinds (Data tab) = map fst (Symtab.dest tab);
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    42
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    43
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    44
(* errors *)
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    45
3989
wenzelm
parents: 3971
diff changeset
    46
fun err_method name kind =
4074
3a2aa65288df tuned error msg;
wenzelm
parents: 3989
diff changeset
    47
  error ("Error while invoking " ^ quote kind ^ " " ^ name ^ " method");
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    48
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    49
fun err_dup_init kind =
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    50
  error ("Duplicate initialization of " ^ quote kind ^ " data");
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    51
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    52
fun err_uninit kind =
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    53
  error ("Tried to access uninitialized " ^ quote kind ^ " data");
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    54
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    55
3872
wenzelm
parents: 3863
diff changeset
    56
(* prepare data *)
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    57
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    58
fun merge (Data tab1, Data tab2) =
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    59
  let
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    60
    val data1 = Symtab.dest tab1;
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    61
    val data2 = Symtab.dest tab2;
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    62
    val all_data = data1 @ data2;
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    63
    val kinds = distinct (map fst all_data);
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    64
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    65
   fun entry data kind =
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    66
     (case assoc (data, kind) of
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    67
       None => []
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    68
     | Some x => [(kind, x)]);
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    69
3872
wenzelm
parents: 3863
diff changeset
    70
    fun merge_entries [(kind, (e, mths as (ext, _, _)))] =
4124
1af16493c57f type object = exn (enhance readability);
wenzelm
parents: 4074
diff changeset
    71
          (kind, (ext e handle _ => err_method "prep_ext" kind, mths))
3872
wenzelm
parents: 3863
diff changeset
    72
      | merge_entries [(kind, (e1, mths as (_, mrg, _))), (_, (e2, _))] =
4124
1af16493c57f type object = exn (enhance readability);
wenzelm
parents: 4074
diff changeset
    73
          (kind, (mrg (e1, e2) handle _ => err_method "merge" kind, mths))
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    74
      | merge_entries _ = sys_error "merge_entries";
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    75
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    76
    val data = map (fn k => merge_entries (entry data1 k @ entry data2 k)) kinds;
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    77
  in Data (Symtab.make data) end;
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    78
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    79
3971
wenzelm
parents: 3872
diff changeset
    80
fun prep_ext data = merge (data, empty);
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    81
3872
wenzelm
parents: 3863
diff changeset
    82
fun init (Data tab) kind e ext mrg prt =
wenzelm
parents: 3863
diff changeset
    83
  Data (Symtab.update_new ((kind, (e, (ext, mrg, prt))), tab))
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    84
    handle Symtab.DUPLICATE _ => err_dup_init kind;
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    85
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    86
3872
wenzelm
parents: 3863
diff changeset
    87
(* access data *)
wenzelm
parents: 3863
diff changeset
    88
wenzelm
parents: 3863
diff changeset
    89
fun lookup tab kind =
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    90
  (case Symtab.lookup (tab, kind) of
3872
wenzelm
parents: 3863
diff changeset
    91
    Some x => x
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    92
  | None => err_uninit kind);
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    93
3872
wenzelm
parents: 3863
diff changeset
    94
fun get (Data tab) kind = fst (lookup tab kind);
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    95
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
    96
fun put (Data tab) kind e =
3872
wenzelm
parents: 3863
diff changeset
    97
  Data (Symtab.update ((kind, (e, snd (lookup tab kind))), tab));
wenzelm
parents: 3863
diff changeset
    98
wenzelm
parents: 3863
diff changeset
    99
fun print (Data tab) kind =
3989
wenzelm
parents: 3971
diff changeset
   100
  let val (e, (_, _, prt)) = lookup tab kind
4124
1af16493c57f type object = exn (enhance readability);
wenzelm
parents: 4074
diff changeset
   101
  in prt e handle _ => err_method "print" kind end;
3863
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
   102
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
   103
7ebf561cbbb4 Arbitrarily typed data.
wenzelm
parents:
diff changeset
   104
end;