src/Pure/General/name_space.ML
changeset 33095 bbd52d2f8696
parent 33091 d23e75d4f7da
child 33096 db3c18fd9708
equal deleted inserted replaced
33094:ef0d77b1e687 33095:bbd52d2f8696
    44     (string -> 'a * 'a -> 'a) (*Symtab.SAME*) -> 'a table * 'a table -> 'a table
    44     (string -> 'a * 'a -> 'a) (*Symtab.SAME*) -> 'a table * 'a table -> 'a table
    45   val dest_table: 'a table -> (string * 'a) list
    45   val dest_table: 'a table -> (string * 'a) list
    46   val extern_table: 'a table -> (xstring * 'a) list
    46   val extern_table: 'a table -> (xstring * 'a) list
    47 end;
    47 end;
    48 
    48 
    49 structure NameSpace: NAME_SPACE =
    49 structure Name_Space: NAME_SPACE =
    50 struct
    50 struct
    51 
    51 
    52 
    52 
    53 (** name spaces **)
    53 (** name spaces **)
    54 
    54 
    77 
    77 
    78 
    78 
    79 (* datatype T *)
    79 (* datatype T *)
    80 
    80 
    81 datatype T =
    81 datatype T =
    82   NameSpace of
    82   Name_Space of
    83     (string list * string list) Symtab.table *   (*internals, hidden internals*)
    83     (string list * string list) Symtab.table *   (*internals, hidden internals*)
    84     entry Symtab.table;
    84     entry Symtab.table;
    85 
    85 
    86 val empty = NameSpace (Symtab.empty, Symtab.empty);
    86 val empty = Name_Space (Symtab.empty, Symtab.empty);
    87 
    87 
    88 fun lookup (NameSpace (tab, _)) xname =
    88 fun lookup (Name_Space (tab, _)) xname =
    89   (case Symtab.lookup tab xname of
    89   (case Symtab.lookup tab xname of
    90     NONE => (xname, true)
    90     NONE => (xname, true)
    91   | SOME ([], []) => (xname, true)
    91   | SOME ([], []) => (xname, true)
    92   | SOME ([name], _) => (name, true)
    92   | SOME ([name], _) => (name, true)
    93   | SOME (name :: _, _) => (name, false)
    93   | SOME (name :: _, _) => (name, false)
    94   | SOME ([], name' :: _) => (hidden name', true));
    94   | SOME ([], name' :: _) => (hidden name', true));
    95 
    95 
    96 fun get_accesses (NameSpace (_, entries)) name =
    96 fun get_accesses (Name_Space (_, entries)) name =
    97   (case Symtab.lookup entries name of
    97   (case Symtab.lookup entries name of
    98     NONE => [name]
    98     NONE => [name]
    99   | SOME {externals, ...} => externals);
    99   | SOME {externals, ...} => externals);
   100 
   100 
   101 fun valid_accesses (NameSpace (tab, _)) name =
   101 fun valid_accesses (Name_Space (tab, _)) name =
   102   Symtab.fold (fn (xname, (names, _)) =>
   102   Symtab.fold (fn (xname, (names, _)) =>
   103     if not (null names) andalso hd names = name then cons xname else I) tab [];
   103     if not (null names) andalso hd names = name then cons xname else I) tab [];
   104 
   104 
   105 
   105 
   106 (* intern and extern *)
   106 (* intern and extern *)
   134 
   134 
   135 (* basic operations *)
   135 (* basic operations *)
   136 
   136 
   137 local
   137 local
   138 
   138 
   139 fun map_space f xname (NameSpace (tab, entries)) =
   139 fun map_space f xname (Name_Space (tab, entries)) =
   140   NameSpace (Symtab.map_default (xname, ([], [])) f tab, entries);
   140   Name_Space (Symtab.map_default (xname, ([], [])) f tab, entries);
   141 
   141 
   142 in
   142 in
   143 
   143 
   144 val del_name = map_space o apfst o remove (op =);
   144 val del_name = map_space o apfst o remove (op =);
   145 fun del_name_extra name = map_space (apfst (fn [] => [] | x :: xs => x :: remove (op =) name xs));
   145 fun del_name_extra name = map_space (apfst (fn [] => [] | x :: xs => x :: remove (op =) name xs));
   166     end;
   166     end;
   167 
   167 
   168 
   168 
   169 (* merge *)
   169 (* merge *)
   170 
   170 
   171 fun merge (NameSpace (tab1, entries1), NameSpace (tab2, entries2)) =
   171 fun merge (Name_Space (tab1, entries1), Name_Space (tab2, entries2)) =
   172   let
   172   let
   173     val tab' = (tab1, tab2) |> Symtab.join
   173     val tab' = (tab1, tab2) |> Symtab.join
   174       (K (fn ((names1, names1'), (names2, names2')) =>
   174       (K (fn ((names1, names1'), (names2, names2')) =>
   175         if pointer_eq (names1, names2) andalso pointer_eq (names1', names2')
   175         if pointer_eq (names1, names2) andalso pointer_eq (names1', names2')
   176         then raise Symtab.SAME
   176         then raise Symtab.SAME
   180         if #id entry1 = #id entry2 then raise Symtab.SAME
   180         if #id entry1 = #id entry2 then raise Symtab.SAME
   181         else
   181         else
   182           error ("Duplicate declaration " ^
   182           error ("Duplicate declaration " ^
   183             quote (str_of_entry true (name, entry1)) ^ " vs. " ^
   183             quote (str_of_entry true (name, entry1)) ^ " vs. " ^
   184             quote (str_of_entry true (name, entry2))));
   184             quote (str_of_entry true (name, entry2))));
   185   in NameSpace (tab', entries') end;
   185   in Name_Space (tab', entries') end;
   186 
   186 
   187 
   187 
   188 
   188 
   189 (** naming contexts **)
   189 (** naming contexts **)
   190 
   190 
   243 fun external_names naming = #2 o accesses naming o Binding.qualified_name;
   243 fun external_names naming = #2 o accesses naming o Binding.qualified_name;
   244 
   244 
   245 
   245 
   246 (* declaration *)
   246 (* declaration *)
   247 
   247 
   248 fun new_entry strict entry (NameSpace (tab, entries)) =
   248 fun new_entry strict entry (Name_Space (tab, entries)) =
   249   let
   249   let
   250     val entries' =
   250     val entries' =
   251       (if strict then Symtab.update_new else Symtab.update) entry entries
   251       (if strict then Symtab.update_new else Symtab.update) entry entries
   252         handle Symtab.DUP _ =>
   252         handle Symtab.DUP _ =>
   253           error ("Duplicate declaration " ^ quote (str_of_entry true entry));
   253           error ("Duplicate declaration " ^ quote (str_of_entry true entry));
   254   in NameSpace (tab, entries') end;
   254   in Name_Space (tab, entries') end;
   255 
   255 
   256 fun declare strict naming binding space =
   256 fun declare strict naming binding space =
   257   let
   257   let
   258     val names = full naming binding;
   258     val names = full naming binding;
   259     val name = Long_Name.implode names;
   259     val name = Long_Name.implode names;
   292 fun dest_table tab = map (apfst #1) (ext_table tab);
   292 fun dest_table tab = map (apfst #1) (ext_table tab);
   293 fun extern_table tab = map (apfst #2) (ext_table tab);
   293 fun extern_table tab = map (apfst #2) (ext_table tab);
   294 
   294 
   295 end;
   295 end;
   296 
   296 
   297 structure Basic_Name_Space: BASIC_NAME_SPACE = NameSpace;
   297 structure Basic_Name_Space: BASIC_NAME_SPACE = Name_Space;
   298 open Basic_Name_Space;
   298 open Basic_Name_Space;
   299 
   299