author | wenzelm |
Wed, 11 Sep 2013 15:42:05 +0200 | |
changeset 53539 | 51157ee7f5ba |
parent 51949 | f6858bb224c9 |
child 55669 | 4612c450b59c |
permissions | -rw-r--r-- |
6118 | 1 |
(* Title: Pure/General/name_space.ML |
5012 | 2 |
Author: Markus Wenzel, TU Muenchen |
3 |
||
16137 | 4 |
Generic name spaces with declared and hidden entries. Unknown names |
16341
e573e5167eda
added type NameSpace.table with basic operations;
wenzelm
parents:
16262
diff
changeset
|
5 |
are considered global; no support for absolute addressing. |
16137 | 6 |
*) |
7 |
||
26440 | 8 |
type xstring = string; (*external names*) |
5012 | 9 |
|
10 |
signature NAME_SPACE = |
|
11 |
sig |
|
9120 | 12 |
val hidden: string -> string |
25225 | 13 |
val is_hidden: string -> bool |
5012 | 14 |
type T |
33096 | 15 |
val empty: string -> T |
16 |
val kind_of: T -> string |
|
46869 | 17 |
val defined_entry: T -> string -> bool |
33164
b8fd9b6bba7c
Name_Space.naming: maintain group and theory_name as well;
wenzelm
parents:
33157
diff
changeset
|
18 |
val the_entry: T -> string -> |
b8fd9b6bba7c
Name_Space.naming: maintain group and theory_name as well;
wenzelm
parents:
33157
diff
changeset
|
19 |
{concealed: bool, group: serial option, theory_name: string, pos: Position.T, id: serial} |
42487 | 20 |
val entry_ord: T -> string * string -> order |
42379 | 21 |
val markup: T -> string -> Markup.T |
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
33097
diff
changeset
|
22 |
val is_concealed: T -> string -> bool |
16137 | 23 |
val intern: T -> xstring -> string |
42669
04dfffda5671
more conventional naming scheme: names_long, names_short, names_unique;
wenzelm
parents:
42493
diff
changeset
|
24 |
val names_long_raw: Config.raw |
04dfffda5671
more conventional naming scheme: names_long, names_short, names_unique;
wenzelm
parents:
42493
diff
changeset
|
25 |
val names_long: bool Config.T |
04dfffda5671
more conventional naming scheme: names_long, names_short, names_unique;
wenzelm
parents:
42493
diff
changeset
|
26 |
val names_short_raw: Config.raw |
04dfffda5671
more conventional naming scheme: names_long, names_short, names_unique;
wenzelm
parents:
42493
diff
changeset
|
27 |
val names_short: bool Config.T |
04dfffda5671
more conventional naming scheme: names_long, names_short, names_unique;
wenzelm
parents:
42493
diff
changeset
|
28 |
val names_unique_raw: Config.raw |
04dfffda5671
more conventional naming scheme: names_long, names_short, names_unique;
wenzelm
parents:
42493
diff
changeset
|
29 |
val names_unique: bool Config.T |
42358
b47d41d9f4b5
Name_Space: proper configuration options long_names, short_names, unique_names instead of former unsynchronized references;
wenzelm
parents:
42327
diff
changeset
|
30 |
val extern: Proof.context -> T -> string -> xstring |
51510
b4f7e6734acc
tuned print_classes: more standard order, markup, formatting;
wenzelm
parents:
50301
diff
changeset
|
31 |
val extern_ord: Proof.context -> T -> string * string -> order |
b4f7e6734acc
tuned print_classes: more standard order, markup, formatting;
wenzelm
parents:
50301
diff
changeset
|
32 |
val markup_extern: Proof.context -> T -> string -> Markup.T * xstring |
53539 | 33 |
val pretty: Proof.context -> T -> string -> Pretty.T |
16137 | 34 |
val hide: bool -> string -> T -> T |
5012 | 35 |
val merge: T * T -> T |
16137 | 36 |
type naming |
33164
b8fd9b6bba7c
Name_Space.naming: maintain group and theory_name as well;
wenzelm
parents:
33157
diff
changeset
|
37 |
val conceal: naming -> naming |
33724 | 38 |
val get_group: naming -> serial option |
39 |
val set_group: serial option -> naming -> naming |
|
33164
b8fd9b6bba7c
Name_Space.naming: maintain group and theory_name as well;
wenzelm
parents:
33157
diff
changeset
|
40 |
val set_theory_name: string -> naming -> naming |
33724 | 41 |
val new_group: naming -> naming |
42 |
val reset_group: naming -> naming |
|
16137 | 43 |
val add_path: string -> naming -> naming |
30418
b5044aca0729
add_path: discontinued special meaning of "//", "/", "..";
wenzelm
parents:
30412
diff
changeset
|
44 |
val root_path: naming -> naming |
b5044aca0729
add_path: discontinued special meaning of "//", "/", "..";
wenzelm
parents:
30412
diff
changeset
|
45 |
val parent_path: naming -> naming |
30469 | 46 |
val mandatory_path: string -> naming -> naming |
35200
aaddb2b526d6
more systematic treatment of qualified names derived from binding;
wenzelm
parents:
33724
diff
changeset
|
47 |
val qualified_path: bool -> binding -> naming -> naming |
47005
421760a1efe7
maintain generic context naming in structure Name_Space (NB: empty = default_naming, init = local_naming);
wenzelm
parents:
47003
diff
changeset
|
48 |
val default_naming: naming |
421760a1efe7
maintain generic context naming in structure Name_Space (NB: empty = default_naming, init = local_naming);
wenzelm
parents:
47003
diff
changeset
|
49 |
val local_naming: naming |
33281
223ef9bc399a
let naming transform binding beforehand -- covering only the "conceal" flag for now;
wenzelm
parents:
33164
diff
changeset
|
50 |
val transform_binding: naming -> binding -> binding |
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
33097
diff
changeset
|
51 |
val full_name: naming -> binding -> string |
47021
f35f654f297d
clarified Binding.name_of vs Name_Space.base_name vs Variable.check_name (see also 9bd8d4addd6e, 3305f573294e);
wenzelm
parents:
47005
diff
changeset
|
52 |
val base_name: binding -> string |
47003 | 53 |
val alias: naming -> binding -> string -> T -> T |
47005
421760a1efe7
maintain generic context naming in structure Name_Space (NB: empty = default_naming, init = local_naming);
wenzelm
parents:
47003
diff
changeset
|
54 |
val naming_of: Context.generic -> naming |
421760a1efe7
maintain generic context naming in structure Name_Space (NB: empty = default_naming, init = local_naming);
wenzelm
parents:
47003
diff
changeset
|
55 |
val map_naming: (naming -> naming) -> Context.generic -> Context.generic |
421760a1efe7
maintain generic context naming in structure Name_Space (NB: empty = default_naming, init = local_naming);
wenzelm
parents:
47003
diff
changeset
|
56 |
val declare: Context.generic -> bool -> binding -> T -> string * T |
24361 | 57 |
type 'a table = T * 'a Symtab.table |
47005
421760a1efe7
maintain generic context naming in structure Name_Space (NB: empty = default_naming, init = local_naming);
wenzelm
parents:
47003
diff
changeset
|
58 |
val check: Context.generic -> 'a table -> xstring * Position.T -> string * 'a |
42466 | 59 |
val get: 'a table -> string -> 'a |
47005
421760a1efe7
maintain generic context naming in structure Name_Space (NB: empty = default_naming, init = local_naming);
wenzelm
parents:
47003
diff
changeset
|
60 |
val define: Context.generic -> bool -> binding * 'a -> 'a table -> string * 'a table |
33096 | 61 |
val empty_table: string -> 'a table |
33091
d23e75d4f7da
maintain abstract entry, with position, identity etc.;
wenzelm
parents:
33049
diff
changeset
|
62 |
val merge_tables: 'a table * 'a table -> 'a table |
33097
9d501e11084a
maintain position of formal entities via name space;
wenzelm
parents:
33096
diff
changeset
|
63 |
val join_tables: (string -> 'a * 'a -> 'a) (*Symtab.SAME*) -> |
9d501e11084a
maintain position of formal entities via name space;
wenzelm
parents:
33096
diff
changeset
|
64 |
'a table * 'a table -> 'a table |
42358
b47d41d9f4b5
Name_Space: proper configuration options long_names, short_names, unique_names instead of former unsynchronized references;
wenzelm
parents:
42327
diff
changeset
|
65 |
val dest_table: Proof.context -> 'a table -> (string * 'a) list |
50301 | 66 |
val extern_table: Proof.context -> 'a table -> ((Markup.T * xstring) * 'a) list |
5012 | 67 |
end; |
68 |
||
33095
bbd52d2f8696
renamed NameSpace to Name_Space -- also to emphasize its subtle change in semantics;
wenzelm
parents:
33091
diff
changeset
|
69 |
structure Name_Space: NAME_SPACE = |
5012 | 70 |
struct |
71 |
||
30412
7f5b0a020ccd
just one naming policy based on binding content -- eliminated odd "object-oriented" style;
wenzelm
parents:
30359
diff
changeset
|
72 |
|
7f5b0a020ccd
just one naming policy based on binding content -- eliminated odd "object-oriented" style;
wenzelm
parents:
30359
diff
changeset
|
73 |
(** name spaces **) |
7f5b0a020ccd
just one naming policy based on binding content -- eliminated odd "object-oriented" style;
wenzelm
parents:
30359
diff
changeset
|
74 |
|
7f5b0a020ccd
just one naming policy based on binding content -- eliminated odd "object-oriented" style;
wenzelm
parents:
30359
diff
changeset
|
75 |
(* hidden entries *) |
5012 | 76 |
|
16137 | 77 |
fun hidden name = "??." ^ name; |
29338 | 78 |
val is_hidden = String.isPrefix "??."; |
16137 | 79 |
|
5012 | 80 |
|
33091
d23e75d4f7da
maintain abstract entry, with position, identity etc.;
wenzelm
parents:
33049
diff
changeset
|
81 |
(* datatype entry *) |
d23e75d4f7da
maintain abstract entry, with position, identity etc.;
wenzelm
parents:
33049
diff
changeset
|
82 |
|
d23e75d4f7da
maintain abstract entry, with position, identity etc.;
wenzelm
parents:
33049
diff
changeset
|
83 |
type entry = |
35679
da87ffdcf7ea
added Name_Space.alias -- additional accesses for an existing entry;
wenzelm
parents:
35432
diff
changeset
|
84 |
{concealed: bool, |
33164
b8fd9b6bba7c
Name_Space.naming: maintain group and theory_name as well;
wenzelm
parents:
33157
diff
changeset
|
85 |
group: serial option, |
b8fd9b6bba7c
Name_Space.naming: maintain group and theory_name as well;
wenzelm
parents:
33157
diff
changeset
|
86 |
theory_name: string, |
33091
d23e75d4f7da
maintain abstract entry, with position, identity etc.;
wenzelm
parents:
33049
diff
changeset
|
87 |
pos: Position.T, |
d23e75d4f7da
maintain abstract entry, with position, identity etc.;
wenzelm
parents:
33049
diff
changeset
|
88 |
id: serial}; |
d23e75d4f7da
maintain abstract entry, with position, identity etc.;
wenzelm
parents:
33049
diff
changeset
|
89 |
|
42135 | 90 |
fun entry_markup def kind (name, {pos, id, ...}: entry) = |
50201
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents:
49816
diff
changeset
|
91 |
Markup.properties (Position.entity_properties_of def id pos) (Markup.entity kind name); |
42135 | 92 |
|
49816
e63d6c55ad6d
more position information for hyperlink and placement of message;
wenzelm
parents:
49528
diff
changeset
|
93 |
fun print_entry_ref kind (name, entry) = |
e63d6c55ad6d
more position information for hyperlink and placement of message;
wenzelm
parents:
49528
diff
changeset
|
94 |
quote (Markup.markup (entry_markup false kind (name, entry)) name); |
33091
d23e75d4f7da
maintain abstract entry, with position, identity etc.;
wenzelm
parents:
33049
diff
changeset
|
95 |
|
49816
e63d6c55ad6d
more position information for hyperlink and placement of message;
wenzelm
parents:
49528
diff
changeset
|
96 |
fun err_dup kind entry1 entry2 pos = |
33096 | 97 |
error ("Duplicate " ^ kind ^ " declaration " ^ |
49816
e63d6c55ad6d
more position information for hyperlink and placement of message;
wenzelm
parents:
49528
diff
changeset
|
98 |
print_entry_ref kind entry1 ^ " vs. " ^ print_entry_ref kind entry2 ^ Position.here pos); |
33096 | 99 |
|
42466 | 100 |
fun undefined kind name = "Undefined " ^ kind ^ ": " ^ quote name; |
101 |
||
33091
d23e75d4f7da
maintain abstract entry, with position, identity etc.;
wenzelm
parents:
33049
diff
changeset
|
102 |
|
5012 | 103 |
(* datatype T *) |
104 |
||
105 |
datatype T = |
|
33095
bbd52d2f8696
renamed NameSpace to Name_Space -- also to emphasize its subtle change in semantics;
wenzelm
parents:
33091
diff
changeset
|
106 |
Name_Space of |
33096 | 107 |
{kind: string, |
108 |
internals: (string list * string list) Symtab.table, (*visible, hidden*) |
|
35679
da87ffdcf7ea
added Name_Space.alias -- additional accesses for an existing entry;
wenzelm
parents:
35432
diff
changeset
|
109 |
entries: (xstring list * entry) Symtab.table}; (*externals, entry*) |
33096 | 110 |
|
111 |
fun make_name_space (kind, internals, entries) = |
|
112 |
Name_Space {kind = kind, internals = internals, entries = entries}; |
|
113 |
||
114 |
fun map_name_space f (Name_Space {kind = kind, internals = internals, entries = entries}) = |
|
115 |
make_name_space (f (kind, internals, entries)); |
|
116 |
||
117 |
fun map_internals f xname = map_name_space (fn (kind, internals, entries) => |
|
118 |
(kind, Symtab.map_default (xname, ([], [])) f internals, entries)); |
|
119 |
||
5012 | 120 |
|
33096 | 121 |
fun empty kind = make_name_space (kind, Symtab.empty, Symtab.empty); |
122 |
||
123 |
fun kind_of (Name_Space {kind, ...}) = kind; |
|
5012 | 124 |
|
46869 | 125 |
fun defined_entry (Name_Space {entries, ...}) = Symtab.defined entries; |
126 |
||
33096 | 127 |
fun the_entry (Name_Space {kind, entries, ...}) name = |
128 |
(case Symtab.lookup entries name of |
|
129 |
NONE => error ("Unknown " ^ kind ^ " " ^ quote name) |
|
35679
da87ffdcf7ea
added Name_Space.alias -- additional accesses for an existing entry;
wenzelm
parents:
35432
diff
changeset
|
130 |
| SOME (_, entry) => entry); |
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
33097
diff
changeset
|
131 |
|
42487 | 132 |
fun entry_ord space = int_ord o pairself (#id o the_entry space); |
133 |
||
42379 | 134 |
fun markup (Name_Space {kind, entries, ...}) name = |
42135 | 135 |
(case Symtab.lookup entries name of |
50201
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents:
49816
diff
changeset
|
136 |
NONE => Markup.intensify |
42135 | 137 |
| SOME (_, entry) => entry_markup false kind (name, entry)); |
138 |
||
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
33097
diff
changeset
|
139 |
fun is_concealed space name = #concealed (the_entry space name); |
33096 | 140 |
|
141 |
||
142 |
(* name accesses *) |
|
143 |
||
144 |
fun lookup (Name_Space {internals, ...}) xname = |
|
145 |
(case Symtab.lookup internals xname of |
|
16137 | 146 |
NONE => (xname, true) |
30233
6eb726e43ed1
eliminated internal stamp equality, replaced by bare-metal pointer_eq;
wenzelm
parents:
30222
diff
changeset
|
147 |
| SOME ([], []) => (xname, true) |
6eb726e43ed1
eliminated internal stamp equality, replaced by bare-metal pointer_eq;
wenzelm
parents:
30222
diff
changeset
|
148 |
| SOME ([name], _) => (name, true) |