src/Pure/type.ML
changeset 56025 d74fed45fa8b
parent 56008 2897b2a4f7fd
child 56050 fdccbb97915a
equal deleted inserted replaced
56024:0921c1dc344c 56025:d74fed45fa8b
   175   TSig {classes = classes, default = default, types = types, log_types = log_types};
   175   TSig {classes = classes, default = default, types = types, log_types = log_types};
   176 
   176 
   177 fun build_tsig (classes, default, types) =
   177 fun build_tsig (classes, default, types) =
   178   let
   178   let
   179     val log_types =
   179     val log_types =
   180       Symtab.fold (fn (c, LogicalType n) => cons (c, n) | _ => I) (snd types) []
   180       Name_Space.fold_table (fn (c, LogicalType n) => cons (c, n) | _ => I) types []
   181       |> Library.sort (int_ord o pairself snd) |> map fst;
   181       |> Library.sort (int_ord o pairself snd) |> map fst;
   182   in make_tsig (classes, default, types, log_types) end;
   182   in make_tsig (classes, default, types, log_types) end;
   183 
   183 
   184 fun map_tsig f (TSig {classes, default, types, log_types = _}) =
   184 fun map_tsig f (TSig {classes, default, types, log_types = _}) =
   185   build_tsig (f (classes, default, types));
   185   build_tsig (f (classes, default, types));
   235 fun restore_mode ctxt = set_mode (get_mode ctxt);
   235 fun restore_mode ctxt = set_mode (get_mode ctxt);
   236 
   236 
   237 
   237 
   238 (* types *)
   238 (* types *)
   239 
   239 
   240 val type_space = #1 o #types o rep_tsig;
   240 val type_space = Name_Space.space_of_table o #types o rep_tsig;
   241 
   241 
   242 fun type_alias naming binding name = map_tsig (fn (classes, default, (space, types)) =>
   242 fun type_alias naming binding name = map_tsig (fn (classes, default, types) =>
   243   (classes, default, (Name_Space.alias naming binding name space, types)));
   243   (classes, default, (Name_Space.alias_table naming binding name types)));
   244 
   244 
   245 val is_logtype = member (op =) o logical_types;
   245 val is_logtype = member (op =) o logical_types;
   246 
   246 
   247 
   247 
   248 fun undecl_type c = "Undeclared type constructor: " ^ quote c;
   248 fun undecl_type c = "Undeclared type constructor: " ^ quote c;
   249 
   249 
   250 fun lookup_type (TSig {types = (_, types), ...}) = Symtab.lookup types;
   250 fun lookup_type (TSig {types, ...}) = Option.map #2 o Name_Space.lookup_key types;
   251 
   251 
   252 fun check_decl context (TSig {types, ...}) (c, pos) =
   252 fun check_decl context (TSig {types, ...}) (c, pos) =
   253   Name_Space.check_reports context types (c, [pos]);
   253   Name_Space.check_reports context types (c, [pos]);
   254 
   254 
   255 fun the_decl tsig (c, pos) =
   255 fun the_decl tsig (c, pos) =
   637 fun new_decl context (c, decl) types =
   637 fun new_decl context (c, decl) types =
   638   (Binding.check c; #2 (Name_Space.define context true (c, decl) types));
   638   (Binding.check c; #2 (Name_Space.define context true (c, decl) types));
   639 
   639 
   640 fun map_types f = map_tsig (fn (classes, default, types) =>
   640 fun map_types f = map_tsig (fn (classes, default, types) =>
   641   let
   641   let
   642     val (space', tab') = f types;
   642     val types' = f types;
   643     val _ = Name_Space.intern space' "dummy" = "dummy" orelse
   643     val _ =
   644       error "Illegal declaration of dummy type";
   644       Name_Space.intern (Name_Space.space_of_table types') "dummy" = "dummy" orelse
   645   in (classes, default, (space', tab')) end);
   645         error "Illegal declaration of dummy type";
   646 
   646   in (classes, default, types') end);
   647 fun syntactic types (Type (c, Ts)) =
   647 
   648       (case Symtab.lookup types c of SOME Nonterminal => true | _ => false)
   648 fun syntactic tsig (Type (c, Ts)) =
   649         orelse exists (syntactic types) Ts
   649       (case lookup_type tsig c of SOME Nonterminal => true | _ => false)
       
   650         orelse exists (syntactic tsig) Ts
   650   | syntactic _ _ = false;
   651   | syntactic _ _ = false;
   651 
   652 
   652 in
   653 in
   653 
   654 
   654 fun add_type context (c, n) =
   655 fun add_type context (c, n) =
   667       | dups => err ("Duplicate variables on lhs: " ^ commas_quote dups));
   668       | dups => err ("Duplicate variables on lhs: " ^ commas_quote dups));
   668     val _ =
   669     val _ =
   669       (case subtract (op =) vs (map #1 (Term.add_tfreesT rhs' [])) of
   670       (case subtract (op =) vs (map #1 (Term.add_tfreesT rhs' [])) of
   670         [] => []
   671         [] => []
   671       | extras => err ("Extra variables on rhs: " ^ commas_quote extras));
   672       | extras => err ("Extra variables on rhs: " ^ commas_quote extras));
   672   in types |> new_decl context (a, Abbreviation (vs, rhs', syntactic (#2 types) rhs')) end);
   673   in types |> new_decl context (a, Abbreviation (vs, rhs', syntactic tsig rhs')) end);
   673 
   674 
   674 fun add_nonterminal context = map_types o new_decl context o rpair Nonterminal;
   675 fun add_nonterminal context = map_types o new_decl context o rpair Nonterminal;
   675 
   676 
   676 end;
   677 end;
   677 
   678 
   678 fun hide_type fully c = map_tsig (fn (classes, default, (space, types)) =>
   679 fun hide_type fully c = map_tsig (fn (classes, default, types) =>
   679   (classes, default, (Name_Space.hide fully c space, types)));
   680   (classes, default, Name_Space.hide_table fully c types));
   680 
   681 
   681 
   682 
   682 (* merge type signatures *)
   683 (* merge type signatures *)
   683 
   684 
   684 fun merge_tsig pp (tsig1, tsig2) =
   685 fun merge_tsig pp (tsig1, tsig2) =