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 |
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 |