support for absolute namespace entry paths;
authorwenzelm
Wed, 15 Aug 2001 22:20:30 +0200
changeset 11501 3b6415035d1a
parent 11500 a84130c7e6ab
child 11502 e80a712982e1
support for absolute namespace entry paths;
src/Pure/display.ML
src/Pure/sign.ML
src/Pure/theory.ML
--- a/src/Pure/display.ML	Fri Aug 10 10:25:45 2001 +0200
+++ b/src/Pure/display.ML	Wed Aug 15 22:20:30 2001 +0200
@@ -211,7 +211,7 @@
   in
     [Pretty.strs ("stamps:" :: Sign.stamp_names_of sg),
       Pretty.strs ("data:" :: Sign.data_kinds data),
-      Pretty.strs ["name prefix:", NameSpace.pack path],
+      Pretty.strs ["name prefix:", NameSpace.pack (if_none path ["-"])],
       Pretty.big_list "name spaces:" (map pretty_name_space spaces'),
       pretty_classes classes,
       Pretty.big_list "class relation:" (map pretty_classrel (Symtab.dest classrel)),
--- a/src/Pure/sign.ML	Fri Aug 10 10:25:45 2001 +0200
+++ b/src/Pure/sign.ML	Wed Aug 15 22:20:30 2001 +0200
@@ -25,7 +25,7 @@
     tsig: Type.type_sig,
     const_tab: typ Symtab.table,
     syn: Syntax.syntax,
-    path: string list,
+    path: string list option,
     spaces: (string * NameSpace.T) list,
     data: data}
   val name_of: sg -> string
@@ -178,7 +178,7 @@
     tsig: Type.type_sig,                        (*order-sorted signature of types*)
     const_tab: typ Symtab.table,                (*type schemes of constants*)
     syn: Syntax.syntax,                         (*syntax for parsing and printing*)
-    path: string list,                          (*current name space entry prefix*)
+    path: string list option,                   (*current name space entry prefix*)
     spaces: (string * NameSpace.T) list,        (*name spaces for consts, types etc.*)
     data: data}                                 (*anytype data*)
 and data =
@@ -441,11 +441,12 @@
 fun hide_names x = change_space NameSpace.hide x;
 
 (*make full names*)
-fun full path name =
-  if name = "" then error "Attempt to declare empty name \"\""
-  else if NameSpace.is_qualified name then
-    error ("Attempt to declare qualified name " ^ quote name)
-  else NameSpace.pack (path @ [name]);
+fun full _ "" = error "Attempt to declare empty name \"\""
+  | full None name = name
+  | full (Some path) name =
+      if NameSpace.is_qualified name then
+        error ("Attempt to declare qualified name " ^ quote name)
+      else NameSpace.pack (path @ [name]);
 
 (*base name*)
 val base_name = NameSpace.base;
@@ -507,8 +508,10 @@
   val intern_tycons = intrn_tycons o spaces_of;
 
   val full_name = full o #path o rep_sg;
-  fun full_name_path sg elems name =
-    full (#path (rep_sg sg) @ NameSpace.unpack elems) name;
+
+  fun full_name_path sg elems =
+    full (Some (if_none (#path (rep_sg sg)) [] @ NameSpace.unpack elems));
+
 end;
 
 
@@ -970,9 +973,11 @@
 fun ext_path (syn, tsig, ctab, (path, spaces), data) elems =
   let
     val path' =
-      if elems = ".." andalso not (null path) then fst (split_last path)
-      else if elems = "/" then []
-      else path @ NameSpace.unpack elems;
+      if elems = "//" then None
+      else if elems = "/" then Some []
+      else if elems = ".." andalso is_some path andalso path <> Some [] then
+        Some (fst (split_last (the path)))
+      else Some (if_none path [] @ NameSpace.unpack elems);
   in
     (syn, tsig, ctab, (path', spaces), data)
   end;
@@ -1107,7 +1112,7 @@
           raise TERM ("Incompatible types for constant(s) " ^ commas_quote cs, []);
       val syn = Syntax.merge_syntaxes syn1 syn2;
 
-      val path = [];
+      val path = Some [];
       val kinds = distinct (map fst (spaces1 @ spaces2));
       val spaces =
         kinds ~~
@@ -1126,11 +1131,11 @@
 (** partial Pure signature **)
 
 val dummy_sg = make_sign (ref "", SgRef None, Type.tsig0,
-  Symtab.empty, Syntax.pure_syn, [], [], empty_data, []);
+  Symtab.empty, Syntax.pure_syn, Some [], [], empty_data, []);
 
 val pre_pure =
   create_sign (SgRef (Some (ref dummy_sg))) [] "#"
-    (Syntax.pure_syn, Type.tsig0, Symtab.empty, ([], []), empty_data);
+    (Syntax.pure_syn, Type.tsig0, Symtab.empty, (Some [], []), empty_data);
 
 
 end;
--- a/src/Pure/theory.ML	Fri Aug 10 10:25:45 2001 +0200
+++ b/src/Pure/theory.ML	Wed Aug 15 22:20:30 2001 +0200
@@ -78,6 +78,7 @@
   val add_path: string -> theory -> theory
   val parent_path: theory -> theory
   val root_path: theory -> theory
+  val absolute_path: theory -> theory
   val hide_space: string * xstring list -> theory -> theory
   val hide_space_i: string * string list -> theory -> theory
   val hide_classes: string list -> theory -> theory
@@ -217,6 +218,7 @@
 val add_path         = ext_sign Sign.add_path;
 val parent_path      = add_path "..";
 val root_path        = add_path "/";
+val absolute_path    = add_path "//";
 val add_space        = ext_sign Sign.add_space;
 val hide_space       = ext_sign Sign.hide_space;
 val hide_space_i     = ext_sign Sign.hide_space_i;