src/Pure/sign.ML
changeset 12123 739eba13e2cd
parent 12068 469f372d63db
child 12286 fe218fdc961a
equal deleted inserted replaced
12122:7f8d88ed4f21 12123:739eba13e2cd
   146   val hide_space_i: string * string list -> sg -> sg
   146   val hide_space_i: string * string list -> sg -> sg
   147   val add_name: string -> sg -> sg
   147   val add_name: string -> sg -> sg
   148   val data_kinds: data -> string list
   148   val data_kinds: data -> string list
   149   val merge_refs: sg_ref * sg_ref -> sg_ref
   149   val merge_refs: sg_ref * sg_ref -> sg_ref
   150   val merge: sg * sg -> sg
   150   val merge: sg * sg -> sg
       
   151   val copy: sg -> sg
       
   152   val finish: sg -> sg
   151   val prep_ext: sg -> sg
   153   val prep_ext: sg -> sg
   152   val copy: sg -> sg
       
   153   val PureN: string
   154   val PureN: string
   154   val CPureN: string
   155   val CPureN: string
   155   val nontriv_merge: sg * sg -> sg
   156   val nontriv_merge: sg * sg -> sg
   156   val pre_pure: sg
   157   val pre_pure: sg
   157   val const_of_class: class -> string
   158   val const_of_class: class -> string
   160 
   161 
   161 signature PRIVATE_SIGN =
   162 signature PRIVATE_SIGN =
   162 sig
   163 sig
   163   include SIGN
   164   include SIGN
   164   val init_data: Object.kind * (Object.T * (Object.T -> Object.T) * (Object.T -> Object.T) *
   165   val init_data: Object.kind * (Object.T * (Object.T -> Object.T) * (Object.T -> Object.T) *
   165     (Object.T * Object.T -> Object.T) * (sg -> Object.T -> unit)) -> sg -> sg
   166     (Object.T -> Object.T) * (Object.T * Object.T -> Object.T) * (sg -> Object.T -> unit))
       
   167     -> sg -> sg
   166   val get_data: Object.kind -> (Object.T -> 'a) -> sg -> 'a
   168   val get_data: Object.kind -> (Object.T -> 'a) -> sg -> 'a
   167   val put_data: Object.kind -> ('a -> Object.T) -> 'a -> sg -> sg
   169   val put_data: Object.kind -> ('a -> Object.T) -> 'a -> sg -> sg
   168   val print_data: Object.kind -> sg -> unit
   170   val print_data: Object.kind -> sg -> unit
   169 end;
   171 end;
   170 
   172 
   189     data: data}                                 (*anytype data*)
   191     data: data}                                 (*anytype data*)
   190 and data =
   192 and data =
   191   Data of
   193   Data of
   192     (Object.kind *                              (*kind (for authorization)*)
   194     (Object.kind *                              (*kind (for authorization)*)
   193       (Object.T *                               (*value*)
   195       (Object.T *                               (*value*)
   194         ((Object.T -> Object.T) *               (*prepare extend method*)
   196         ((Object.T -> Object.T) *               (*copy method*)
   195           (Object.T -> Object.T) *              (*copy method*)
   197           (Object.T -> Object.T) *              (*finish method*)
       
   198           (Object.T -> Object.T) *              (*prepare extend method*)
   196           (Object.T * Object.T -> Object.T) *   (*merge and prepare extend method*)
   199           (Object.T * Object.T -> Object.T) *   (*merge and prepare extend method*)
   197           (sg -> Object.T -> unit))))           (*print method*)
   200           (sg -> Object.T -> unit))))           (*print method*)
   198     Symtab.table
   201     Symtab.table
   199 and sg_ref =
   202 and sg_ref =
   200   SgRef of sg ref option;
   203   SgRef of sg ref option;
   335    fun entry data kind =
   338    fun entry data kind =
   336      (case gen_assoc Object.eq_kind (data, kind) of
   339      (case gen_assoc Object.eq_kind (data, kind) of
   337        None => []
   340        None => []
   338      | Some x => [(kind, x)]);
   341      | Some x => [(kind, x)]);
   339 
   342 
   340     fun merge_entries [(kind, (e, mths as (_, ext, _, _)))] =
   343     fun merge_entries [(kind, (e, mths as (_, _, ext, _, _)))] =
   341           (kind, (ext e handle exn => err_method "prep_ext" (Object.name_of_kind kind) exn, mths))
   344           (kind, (ext e handle exn => err_method "prep_ext" (Object.name_of_kind kind) exn, mths))
   342       | merge_entries [(kind, (e1, mths as (_, _, mrg, _))), (_, (e2, _))] =
   345       | merge_entries [(kind, (e1, mths as (_, _, _, mrg, _))), (_, (e2, _))] =
   343           (kind, (mrg (e1, e2)
   346           (kind, (mrg (e1, e2)
   344             handle exn => err_method "merge" (Object.name_of_kind kind) exn, mths))
   347             handle exn => err_method "merge" (Object.name_of_kind kind) exn, mths))
   345       | merge_entries _ = sys_error "merge_entries";
   348       | merge_entries _ = sys_error "merge_entries";
   346 
   349 
   347     val data = map (fn k => merge_entries (entry data1 k @ entry data2 k)) kinds;
   350     val data = map (fn k => merge_entries (entry data1 k @ entry data2 k)) kinds;
   351       handle Symtab.DUPS dups => err_inconsistent dups
   354       handle Symtab.DUPS dups => err_inconsistent dups
   352   end;
   355   end;
   353 
   356 
   354 fun prep_ext_data data = merge_data (data, empty_data);
   357 fun prep_ext_data data = merge_data (data, empty_data);
   355 
   358 
   356 fun init_data_sg sg (Data tab) kind e cp ext mrg prt =
   359 fun init_data_sg sg (Data tab) kind e cp fin ext mrg prt =
   357   let val name = Object.name_of_kind kind in
   360   let val name = Object.name_of_kind kind in
   358     Data (Symtab.update_new ((name, (kind, (e, (cp, ext, mrg, prt)))), tab))
   361     Data (Symtab.update_new ((name, (kind, (e, (cp, fin, ext, mrg, prt)))), tab))
   359       handle Symtab.DUP _ => err_dup_init sg name
   362       handle Symtab.DUP _ => err_dup_init sg name
   360   end;
   363   end;
   361 
   364 
   362 
   365 
   363 (* access data *)
   366 (* access data *)
   376 fun get_data kind f (sg as Sg (_, {data = Data tab, ...})) =
   379 fun get_data kind f (sg as Sg (_, {data = Data tab, ...})) =
   377   let val x = fst (lookup_data sg tab kind)
   380   let val x = fst (lookup_data sg tab kind)
   378   in f x handle Match => Object.kind_error kind end;
   381   in f x handle Match => Object.kind_error kind end;
   379 
   382 
   380 fun print_data kind (sg as Sg (_, {data = Data tab, ...})) =
   383 fun print_data kind (sg as Sg (_, {data = Data tab, ...})) =
   381   let val (e, (_, _, _, prt)) = lookup_data sg tab kind
   384   let val (e, (_, _, _, _, prt)) = lookup_data sg tab kind
   382   in prt sg e handle exn => err_method ("print" ^ of_theory sg) (Object.name_of_kind kind) exn end;
   385   in prt sg e handle exn => err_method ("print" ^ of_theory sg) (Object.name_of_kind kind) exn end;
   383 
   386 
   384 fun put_data_sg sg (Data tab) kind f x =
   387 fun put_data_sg sg (Data tab) kind f x =
   385   Data (Symtab.update ((Object.name_of_kind kind,
   388   Data (Symtab.update ((Object.name_of_kind kind,
   386     (kind, (f x, snd (lookup_data sg tab kind)))), tab));
   389     (kind, (f x, snd (lookup_data sg tab kind)))), tab));
  1013   (syn, tsig, ctab, (path, hide_names spaces kind names), data);
  1016   (syn, tsig, ctab, (path, hide_names spaces kind names), data);
  1014 
  1017 
  1015 
  1018 
  1016 (* signature data *)
  1019 (* signature data *)
  1017 
  1020 
  1018 fun ext_init_data sg (syn, tsig, ctab, names, data) (kind, (e, cp, ext, mrg, prt)) =
  1021 fun ext_init_data sg (syn, tsig, ctab, names, data) (kind, (e, cp, fin, ext, mrg, prt)) =
  1019   (syn, tsig, ctab, names, init_data_sg sg data kind e cp ext mrg prt);
  1022   (syn, tsig, ctab, names, init_data_sg sg data kind e cp fin ext mrg prt);
  1020 
  1023 
  1021 fun ext_put_data sg (syn, tsig, ctab, names, data) (kind, f, x) =
  1024 fun ext_put_data sg (syn, tsig, ctab, names, data) (kind, f, x) =
  1022   (syn, tsig, ctab, names, put_data_sg sg data kind f x);
  1025   (syn, tsig, ctab, names, put_data_sg sg data kind f x);
  1023 
  1026 
  1024 
  1027 
  1025 fun copy_data (k, (e, mths as (cp, _, _, _))) =
  1028 fun finish_data (k, (e, mths as (_, fin, _, _, _))) =
       
  1029   (k, (fin e handle exn => err_method "finish" (Object.name_of_kind k) exn, mths));
       
  1030 
       
  1031 fun ext_finish_data (syn, tsig, ctab, names, Data tab) () =
       
  1032   (syn, tsig, ctab, names, Data (Symtab.map finish_data tab));
       
  1033 
       
  1034 
       
  1035 fun copy_data (k, (e, mths as (cp, _, _, _, _))) =
  1026   (k, (cp e handle exn => err_method "copy" (Object.name_of_kind k) exn, mths));
  1036   (k, (cp e handle exn => err_method "copy" (Object.name_of_kind k) exn, mths));
  1027 
  1037 
  1028 fun copy (sg as Sg ({id = _, stamps}, {self, tsig, const_tab, syn, path, spaces, data})) =
  1038 fun copy (sg as Sg ({id = _, stamps}, {self, tsig, const_tab, syn, path, spaces, data})) =
  1029   let
  1039   let
  1030     val _ = check_stale sg;
  1040     val _ = check_stale sg;
  1063 val add_space         = extend_sign true ext_add_space "#";
  1073 val add_space         = extend_sign true ext_add_space "#";
  1064 val hide_space        = extend_sign true ext_hide_space "#";
  1074 val hide_space        = extend_sign true ext_hide_space "#";
  1065 val hide_space_i      = extend_sign true ext_hide_space_i "#";
  1075 val hide_space_i      = extend_sign true ext_hide_space_i "#";
  1066 fun init_data arg sg  = extend_sign true (ext_init_data sg) "#" arg sg;
  1076 fun init_data arg sg  = extend_sign true (ext_init_data sg) "#" arg sg;
  1067 fun put_data k f x sg = extend_sign true (ext_put_data sg) "#" (k, f, x) sg;
  1077 fun put_data k f x sg = extend_sign true (ext_put_data sg) "#" (k, f, x) sg;
       
  1078 fun finish sg         = extend_sign true ext_finish_data "#" () sg;
  1068 fun add_name name sg  = extend_sign true K name () sg;
  1079 fun add_name name sg  = extend_sign true K name () sg;
  1069 fun prep_ext sg       = extend_sign false K "#" () sg;
  1080 fun prep_ext sg       = extend_sign false K "#" () sg;
  1070 
  1081 
  1071 
  1082 
  1072 
  1083