src/Pure/General/name_space.ML
changeset 28991 694227dd3e8c
parent 28965 1de908189869
child 29004 a5a91f387791
--- a/src/Pure/General/name_space.ML	Thu Dec 04 14:44:07 2008 +0100
+++ b/src/Pure/General/name_space.ML	Fri Dec 05 08:04:53 2008 +0100
@@ -33,7 +33,6 @@
   val default_naming: naming
   val declare: naming -> Binding.T -> T -> string * T
   val full_name: naming -> Binding.T -> string
-  val declare_base: naming -> string -> T -> T
   val external_names: naming -> string -> string list
   val path_of: naming -> string
   val add_path: string -> naming -> naming
@@ -45,6 +44,8 @@
   val bind: naming -> Binding.T * 'a
     -> 'a table -> string * 'a table (*exception Symtab.DUP*)
   val merge_tables: ('a * 'a -> bool) -> 'a table * 'a table -> 'a table
+  val join_tables: (string -> 'a * 'a -> 'a)
+    -> 'a table * 'a table -> 'a table
   val dest_table: 'a table -> (string * 'a) list
   val extern_table: 'a table -> (xstring * 'a) list
   val extend_table: naming -> (bstring * 'a) list -> 'a table -> 'a table
@@ -264,13 +265,9 @@
 
 (* declarations *)
 
-fun full (Naming (path, (qualify, _))) = qualify path;
+fun full_internal (Naming (path, (qualify, _))) = qualify path;
 
-fun full_name naming b =
-  let val (prefix, bname) = Binding.dest b
-  in full (apply_prefix prefix naming) bname end;
-
-fun declare_base naming name space =
+fun declare_internal naming name space =
   if is_hidden name then
     error ("Attempt to declare hidden name " ^ quote name)
   else
@@ -282,12 +279,16 @@
       val (accs, accs') = pairself (map implode_name) (accesses naming names);
     in space |> fold (add_name name) accs |> put_accesses name accs' end;
 
+fun full_name naming b =
+  let val (prefix, bname) = Binding.dest b
+  in full_internal (apply_prefix prefix naming) bname end;
+
 fun declare bnaming b =
   let
     val (prefix, bname) = Binding.dest b;
     val naming = apply_prefix prefix bnaming;
-    val name = full naming bname;
-  in declare_base naming name #> pair name end;
+    val name = full_internal naming bname;
+  in declare_internal naming name #> pair name end;
 
 
 
@@ -303,12 +304,15 @@
   in (name, (space', Symtab.update_new (name, x) tab)) end;
 
 fun extend_table naming bentries (space, tab) =
-  let val entries = map (apfst (full naming)) bentries
-  in (fold (declare_base naming o #1) entries space, Symtab.extend (tab, entries)) end;
+  let val entries = map (apfst (full_internal naming)) bentries
+  in (fold (declare_internal naming o #1) entries space, Symtab.extend (tab, entries)) end;
 
 fun merge_tables eq ((space1, tab1), (space2, tab2)) =
   (merge (space1, space2), Symtab.merge eq (tab1, tab2));
 
+fun join_tables f ((space1, tab1), (space2, tab2)) =
+  (merge (space1, space2), Symtab.join f (tab1, tab2));
+
 fun ext_table (space, tab) =
   Symtab.fold (fn (name, x) => cons ((name, extern space name), x)) tab []
   |> Library.sort_wrt (#2 o #1);