| author | bulwahn | 
| Wed, 21 Jul 2010 18:13:15 +0200 | |
| changeset 37921 | 1e846be00ddf | 
| 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: 
29617diff
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: 
30217diff
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: 
30217diff
changeset | 9 | |
| 30214 
f84c9f10292a
moved name space externalization flags back to name_space.ML;
 wenzelm parents: 
29617diff
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: 
32590diff
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: 
30217diff
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: 
30217diff
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: 
30217diff
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: 
30217diff
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: 
33157diff
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: 
30217diff
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: 
30276diff
changeset | 30 | val prefix: bool -> string -> binding -> binding | 
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
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: 
30795diff
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: 
30217diff
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: 
30217diff
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: 
30795diff
changeset | 42 | abstype binding = Binding of | 
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 43 |  {conceal: bool,                    (*internal -- for foundational purposes only*)
 | 
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
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: 
30795diff
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: 
30795diff
changeset | 48 | with | 
| 28941 | 49 | |
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
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: 
32590diff
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: 
30217diff
changeset | 52 | |
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
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: 
32590diff
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: 
30217diff
changeset | 55 | |
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 56 | fun dest (Binding {conceal, prefix, qualifier, name, ...}) =
 | 
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 57 | (conceal, prefix @ qualifier, name); | 
| 30217 
894eb2034f02
renamed Binding.display to Binding.str_of, which is slightly more canonical;
 wenzelm parents: 
30214diff
changeset | 58 | |
| 30222 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 59 | |
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 60 | |
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 61 | (** basic operations **) | 
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 62 | |
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
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: 
30217diff
changeset | 64 | |
| 33157 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
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: 
30217diff
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: 
30217diff
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: 
30217diff
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: 
30217diff
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: 
32590diff
changeset | 73 | fun map_name f = | 
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
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: 
32590diff
changeset | 75 | (conceal, prefix, qualifier, f name, pos)); | 
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
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: 
30217diff
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: 
30217diff
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: 
30217diff
changeset | 82 | |
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
changeset | 83 | |
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
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: 
32590diff
changeset | 87 | | qualify mandatory qual = | 
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
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: 
32590diff
changeset | 89 | (conceal, prefix, (qual, mandatory) :: qualifier, name, pos)); | 
| 30410 | 90 | |
| 35200 
aaddb2b526d6
more systematic treatment of qualified names derived from binding;
 wenzelm parents: 
33157diff
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: 
33157diff
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: 
33157diff
changeset | 93 | in (conceal, prefix, qualifier', name', pos) end); | 
| 
aaddb2b526d6
more systematic treatment of qualified names derived from binding;
 wenzelm parents: 
33157diff
changeset | 94 | |
| 30361 
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
 wenzelm parents: 
30338diff
changeset | 95 | fun qualified_name "" = empty | 
| 
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
 wenzelm parents: 
30338diff
changeset | 96 | | qualified_name s = | 
| 
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
 wenzelm parents: 
30338diff
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: 
32590diff
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: 
30338diff
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: 
30217diff
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: 
30217diff
changeset | 105 | (* system prefix *) | 
| 
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
 wenzelm parents: 
30217diff
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: 
32590diff
changeset | 109 | fun map_prefix f = | 
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
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: 
32590diff
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: 
30217diff
changeset | 112 | |
| 30335 
b3ef64cadcad
Binding.str_of: removed verbose feature, include qualifier in output;
 wenzelm parents: 
30276diff
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: 
32590diff
changeset | 117 | (* conceal *) | 
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 118 | |
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 119 | val conceal = | 
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 120 | map_binding (fn (_, prefix, qualifier, name, pos) => | 
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 121 | (true, prefix, qualifier, name, pos)); | 
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
changeset | 122 | |
| 
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
 wenzelm parents: 
32590diff
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: 
30795diff
changeset | 133 | end; | 
| 28941 | 134 | |
| 30214 
f84c9f10292a
moved name space externalization flags back to name_space.ML;
 wenzelm parents: 
29617diff
changeset | 135 | type binding = Binding.binding; | 
| 
f84c9f10292a
moved name space externalization flags back to name_space.ML;
 wenzelm parents: 
29617diff
changeset | 136 |