author | haftmann |
Fri, 20 Aug 2010 17:46:56 +0200 | |
changeset 38621 | d6cb7e625d75 |
parent 35200 | aaddb2b526d6 |
child 39442 | 73bcb12fdc69 |
permissions | -rw-r--r-- |
28941 | 1 |
(* Title: Pure/General/binding.ML |
2 |
Author: Florian Haftmann, TU Muenchen |
|
30214
f84c9f10292a
moved name space externalization flags back to name_space.ML;
wenzelm
parents:
29617
diff
changeset
|
3 |
Author: Makarius |
28941 | 4 |
|
5 |
Structured name bindings. |
|
6 |
*) |
|
7 |
||
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
8 |
type bstring = string; (*primitive names to be bound*) |
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
9 |
|
30214
f84c9f10292a
moved name space externalization flags back to name_space.ML;
wenzelm
parents:
29617
diff
changeset
|
10 |
signature BINDING = |
28941 | 11 |
sig |
29581 | 12 |
type binding |
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
13 |
val dest: binding -> bool * (string * bool) list * bstring |
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
14 |
val make: bstring * Position.T -> binding |
30276 | 15 |
val pos_of: binding -> Position.T |
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
16 |
val name: bstring -> binding |
30464 | 17 |
val name_of: binding -> bstring |
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
18 |
val map_name: (bstring -> bstring) -> binding -> binding |
30338 | 19 |
val prefix_name: string -> binding -> binding |
20 |
val suffix_name: string -> binding -> binding |
|
21 |
val eq_name: binding * binding -> bool |
|
29617 | 22 |
val empty: binding |
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
23 |
val is_empty: binding -> bool |
30410 | 24 |
val qualify: bool -> string -> binding -> binding |
35200
aaddb2b526d6
more systematic treatment of qualified names derived from binding;
wenzelm
parents:
33157
diff
changeset
|
25 |
val qualified: bool -> string -> binding -> binding |
30464 | 26 |
val qualified_name: string -> binding |
27 |
val qualified_name_of: binding -> string |
|
30276 | 28 |
val prefix_of: binding -> (string * bool) list |
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
29 |
val map_prefix: ((string * bool) list -> (string * bool) list) -> binding -> binding |
30335
b3ef64cadcad
Binding.str_of: removed verbose feature, include qualifier in output;
wenzelm
parents:
30276
diff
changeset
|
30 |
val prefix: bool -> string -> binding -> binding |
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
31 |
val conceal: binding -> binding |
30410 | 32 |
val str_of: binding -> string |
29617 | 33 |
end; |
28941 | 34 |
|
32590
95f4f08f950f
replaced opaque signature matching by plain old abstype (again, cf. ac4498f95d1c) -- this recovers pretty printing in SML/NJ and Poly/ML 5.3;
wenzelm
parents:
30795
diff
changeset
|
35 |
structure Binding: BINDING = |
28941 | 36 |
struct |
37 |
||
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
38 |
(** representation **) |
29338 | 39 |
|
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
40 |
(* datatype *) |
29338 | 41 |
|
32590
95f4f08f950f
replaced opaque signature matching by plain old abstype (again, cf. ac4498f95d1c) -- this recovers pretty printing in SML/NJ and Poly/ML 5.3;
wenzelm
parents:
30795
diff
changeset
|
42 |
abstype binding = Binding of |
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
43 |
{conceal: bool, (*internal -- for foundational purposes only*) |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
44 |
prefix: (string * bool) list, (*system prefix*) |
30276 | 45 |
qualifier: (string * bool) list, (*user qualifier*) |
46 |
name: bstring, (*base name*) |
|
32590
95f4f08f950f
replaced opaque signature matching by plain old abstype (again, cf. ac4498f95d1c) -- this recovers pretty printing in SML/NJ and Poly/ML 5.3;
wenzelm
parents:
30795
diff
changeset
|
47 |
pos: Position.T} (*source position*) |
95f4f08f950f
replaced opaque signature matching by plain old abstype (again, cf. ac4498f95d1c) -- this recovers pretty printing in SML/NJ and Poly/ML 5.3;
wenzelm
parents:
30795
diff
changeset
|
48 |
with |
28941 | 49 |
|
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
50 |
fun make_binding (conceal, prefix, qualifier, name, pos) = |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
51 |
Binding {conceal = conceal, prefix = prefix, qualifier = qualifier, name = name, pos = pos}; |
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
52 |
|
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
53 |
fun map_binding f (Binding {conceal, prefix, qualifier, name, pos}) = |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
54 |
make_binding (f (conceal, prefix, qualifier, name, pos)); |
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
55 |
|
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
56 |
fun dest (Binding {conceal, prefix, qualifier, name, ...}) = |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
57 |
(conceal, prefix @ qualifier, name); |
30217
894eb2034f02
renamed Binding.display to Binding.str_of, which is slightly more canonical;
wenzelm
parents:
30214
diff
changeset
|
58 |
|
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
59 |
|
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
60 |
|
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
61 |
(** basic operations **) |
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
62 |
|
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
63 |
(* name and position *) |
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
64 |
|
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
65 |
fun make (name, pos) = make_binding (false, [], [], name, pos); |
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
66 |
fun name name = make (name, Position.none); |
28965 | 67 |
|
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
68 |
fun pos_of (Binding {pos, ...}) = pos; |
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
69 |
fun name_of (Binding {name, ...}) = name; |
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
70 |
|
30338 | 71 |
fun eq_name (b, b') = name_of b = name_of b'; |
72 |
||
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
73 |
fun map_name f = |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
74 |
map_binding (fn (conceal, prefix, qualifier, name, pos) => |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
75 |
(conceal, prefix, qualifier, f name, pos)); |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
76 |
|
30338 | 77 |
val prefix_name = map_name o prefix; |
78 |
val suffix_name = map_name o suffix; |
|
28941 | 79 |
|
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
80 |
val empty = name ""; |
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
81 |
fun is_empty b = name_of b = ""; |
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
82 |
|
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
83 |
|
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
84 |
(* user qualifier *) |
28941 | 85 |
|
30410 | 86 |
fun qualify _ "" = I |
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
87 |
| qualify mandatory qual = |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
88 |
map_binding (fn (conceal, prefix, qualifier, name, pos) => |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
89 |
(conceal, prefix, (qual, mandatory) :: qualifier, name, pos)); |
30410 | 90 |
|
35200
aaddb2b526d6
more systematic treatment of qualified names derived from binding;
wenzelm
parents:
33157
diff
changeset
|
91 |
fun qualified mandatory name' = map_binding (fn (conceal, prefix, qualifier, name, pos) => |
aaddb2b526d6
more systematic treatment of qualified names derived from binding;
wenzelm
parents:
33157
diff
changeset
|
92 |
let val qualifier' = if name = "" then qualifier else qualifier @ [(name, mandatory)] |
aaddb2b526d6
more systematic treatment of qualified names derived from binding;
wenzelm
parents:
33157
diff
changeset
|
93 |
in (conceal, prefix, qualifier', name', pos) end); |
aaddb2b526d6
more systematic treatment of qualified names derived from binding;
wenzelm
parents:
33157
diff
changeset
|
94 |
|
30361
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
wenzelm
parents:
30338
diff
changeset
|
95 |
fun qualified_name "" = empty |
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
wenzelm
parents:
30338
diff
changeset
|
96 |
| qualified_name s = |
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
wenzelm
parents:
30338
diff
changeset
|
97 |
let val (qualifier, name) = split_last (Long_Name.explode s) |
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
98 |
in make_binding (false, [], map (rpair false) qualifier, name, Position.none) end; |
30361
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
wenzelm
parents:
30338
diff
changeset
|
99 |
|
30795 | 100 |
fun qualified_name_of (b as Binding {qualifier, name, ...}) = |
101 |
if is_empty b then "" |
|
102 |
else Long_Name.implode (map #1 qualifier @ [name]); |
|
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
103 |
|
28965 | 104 |
|
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
105 |
(* system prefix *) |
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
106 |
|
30276 | 107 |
fun prefix_of (Binding {prefix, ...}) = prefix; |
108 |
||
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
109 |
fun map_prefix f = |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
110 |
map_binding (fn (conceal, prefix, qualifier, name, pos) => |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
111 |
(conceal, f prefix, qualifier, name, pos)); |
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
112 |
|
30335
b3ef64cadcad
Binding.str_of: removed verbose feature, include qualifier in output;
wenzelm
parents:
30276
diff
changeset
|
113 |
fun prefix _ "" = I |
30410 | 114 |
| prefix mandatory prfx = map_prefix (cons (prfx, mandatory)); |
115 |
||
116 |
||
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
117 |
(* conceal *) |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
118 |
|
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
119 |
val conceal = |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
120 |
map_binding (fn (_, prefix, qualifier, name, pos) => |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
121 |
(true, prefix, qualifier, name, pos)); |
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
122 |
|
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
123 |
|
30410 | 124 |
(* str_of *) |
125 |
||
126 |
fun str_of binding = |
|
127 |
let |
|
128 |
val text = qualified_name_of binding; |
|
129 |
val props = Position.properties_of (pos_of binding); |
|
130 |
in Markup.markup (Markup.properties props (Markup.binding (name_of binding))) text end; |
|
28941 | 131 |
|
132 |
end; |
|
32590
95f4f08f950f
replaced opaque signature matching by plain old abstype (again, cf. ac4498f95d1c) -- this recovers pretty printing in SML/NJ and Poly/ML 5.3;
wenzelm
parents:
30795
diff
changeset
|
133 |
end; |
28941 | 134 |
|
30214
f84c9f10292a
moved name space externalization flags back to name_space.ML;
wenzelm
parents:
29617
diff
changeset
|
135 |
type binding = Binding.binding; |
f84c9f10292a
moved name space externalization flags back to name_space.ML;
wenzelm
parents:
29617
diff
changeset
|
136 |