author | wenzelm |
Wed, 03 May 2017 23:04:25 +0200 | |
changeset 65703 | cead65c19f2e |
parent 63369 | 4698dd1106ae |
child 70494 | 41108e3e9ca5 |
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 |
59886 | 12 |
eqtype scope |
13 |
val new_scope: unit -> scope |
|
53380
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
wenzelm
parents:
50239
diff
changeset
|
14 |
eqtype binding |
59858 | 15 |
val path_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
|
16 |
val make: bstring * Position.T -> binding |
30276 | 17 |
val pos_of: binding -> Position.T |
53380
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
wenzelm
parents:
50239
diff
changeset
|
18 |
val set_pos: Position.T -> binding -> binding |
61950 | 19 |
val reset_pos: binding -> binding |
63369 | 20 |
val default_pos: binding -> 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
|
21 |
val name: bstring -> binding |
30464 | 22 |
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
|
23 |
val map_name: (bstring -> bstring) -> binding -> binding |
30338 | 24 |
val prefix_name: string -> binding -> binding |
25 |
val suffix_name: string -> binding -> binding |
|
26 |
val eq_name: binding * binding -> bool |
|
29617 | 27 |
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
|
28 |
val is_empty: binding -> bool |
63352 | 29 |
val empty_atts: binding * 'a list |
30 |
val is_empty_atts: binding * 'a list -> bool |
|
63006 | 31 |
val conglomerate: binding list -> binding |
30410 | 32 |
val qualify: bool -> string -> binding -> binding |
63003 | 33 |
val qualify_name: bool -> binding -> string -> binding |
30464 | 34 |
val qualified_name: string -> binding |
30276 | 35 |
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
|
36 |
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
|
37 |
val prefix: bool -> string -> binding -> binding |
62241 | 38 |
val restricted: (bool * scope) option -> binding -> binding |
59859 | 39 |
val concealed: binding -> binding |
43547
f3a8476285c6
clarified Binding.pretty/print: no quotes, only markup -- Binding.str_of is rendered obsolete;
wenzelm
parents:
43546
diff
changeset
|
40 |
val pretty: binding -> Pretty.T |
42381
309ec68442c6
added Binding.print convenience, which includes quote already;
wenzelm
parents:
41254
diff
changeset
|
41 |
val print: binding -> string |
41254
78c3e472bb35
extra checking of name bindings for classes, types, consts;
wenzelm
parents:
39442
diff
changeset
|
42 |
val bad: binding -> string |
78c3e472bb35
extra checking of name bindings for classes, types, consts;
wenzelm
parents:
39442
diff
changeset
|
43 |
val check: binding -> unit |
59886 | 44 |
val name_spec: scope list -> (string * bool) list -> binding -> |
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
45 |
{restriction: bool option, concealed: bool, spec: (string * bool) list} |
29617 | 46 |
end; |
28941 | 47 |
|
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
|
48 |
structure Binding: BINDING = |
28941 | 49 |
struct |
50 |
||
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
51 |
(** representation **) |
29338 | 52 |
|
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
53 |
(* scope of restricted entries *) |
59886 | 54 |
|
55 |
datatype scope = Scope of serial; |
|
56 |
||
57 |
fun new_scope () = Scope (serial ()); |
|
58 |
||
59 |
||
60 |
(* binding *) |
|
29338 | 61 |
|
53380
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
wenzelm
parents:
50239
diff
changeset
|
62 |
datatype binding = Binding of |
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
63 |
{restricted: (bool * scope) option, (*entry is private (true) or qualified (false) wrt. scope*) |
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
64 |
concealed: bool, (*entry is for foundational purposes -- please ignore*) |
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
65 |
prefix: (string * bool) list, (*system prefix*) |
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
66 |
qualifier: (string * bool) list, (*user qualifier*) |
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
67 |
name: bstring, (*base name*) |
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
68 |
pos: Position.T}; (*source position*) |
28941 | 69 |
|
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
70 |
fun make_binding (restricted, concealed, prefix, qualifier, name, pos) = |
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
71 |
Binding {restricted = restricted, concealed = concealed, prefix = prefix, |
59858 | 72 |
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
|
73 |
|
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
74 |
fun map_binding f (Binding {restricted, concealed, prefix, qualifier, name, pos}) = |
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
75 |
make_binding (f (restricted, concealed, 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
|
76 |
|
59874 | 77 |
fun path_of (Binding {prefix, qualifier, ...}) = prefix @ qualifier; |
30217
894eb2034f02
renamed Binding.display to Binding.str_of, which is slightly more canonical;
wenzelm
parents:
30214
diff
changeset
|
78 |
|
63369 | 79 |
fun make (name, pos) = make_binding (NONE, false, [], [], name, pos); |
80 |
||
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
81 |
|
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 |
(** 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
|
84 |
|
63369 | 85 |
(* position *) |
28965 | 86 |
|
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
87 |
fun pos_of (Binding {pos, ...}) = pos; |
63369 | 88 |
|
53380
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
wenzelm
parents:
50239
diff
changeset
|
89 |
fun set_pos pos = |
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
90 |
map_binding (fn (restricted, concealed, prefix, qualifier, name, _) => |
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
91 |
(restricted, concealed, prefix, qualifier, name, pos)); |
63369 | 92 |
|
61950 | 93 |
val reset_pos = set_pos Position.none; |
53380
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
wenzelm
parents:
50239
diff
changeset
|
94 |
|
63369 | 95 |
fun default_pos b = |
96 |
if pos_of b = Position.none then set_pos (Position.thread_data ()) b else b; |
|
97 |
||
98 |
||
99 |
(* name *) |
|
100 |
||
53380
08f3491c50bf
cases: formal binding of 'assumes', with position provided via invoke_case;
wenzelm
parents:
50239
diff
changeset
|
101 |
fun name name = make (name, Position.none); |
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
102 |
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
|
103 |
|
30338 | 104 |
fun eq_name (b, b') = name_of b = name_of b'; |
105 |
||
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
106 |
fun map_name f = |
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
107 |
map_binding (fn (restricted, concealed, prefix, qualifier, name, pos) => |
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
108 |
(restricted, concealed, prefix, qualifier, f name, pos)); |
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
109 |
|
30338 | 110 |
val prefix_name = map_name o prefix; |
111 |
val suffix_name = map_name o suffix; |
|
28941 | 112 |
|
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
113 |
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
|
114 |
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
|
115 |
|
63352 | 116 |
val empty_atts = (empty, []); |
117 |
fun is_empty_atts (b, atts) = is_empty b andalso null atts; |
|
118 |
||
63006 | 119 |
fun conglomerate [b] = b |
120 |
| conglomerate bs = name (space_implode "_" (map name_of bs)); |
|
121 |
||
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
122 |
|
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
123 |
(* user qualifier *) |
28941 | 124 |
|
30410 | 125 |
fun qualify _ "" = I |
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
126 |
| qualify mandatory qual = |
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
127 |
map_binding (fn (restricted, concealed, prefix, qualifier, name, pos) => |
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
128 |
(restricted, concealed, prefix, (qual, mandatory) :: qualifier, name, pos)); |
30410 | 129 |
|
63003 | 130 |
fun qualify_name mandatory binding name' = |
131 |
binding |> map_binding (fn (restricted, concealed, prefix, qualifier, name, pos) => |
|
59858 | 132 |
let val qualifier' = if name = "" then qualifier else qualifier @ [(name, mandatory)] |
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
133 |
in (restricted, concealed, prefix, qualifier', name', pos) end); |
35200
aaddb2b526d6
more systematic treatment of qualified names derived from binding;
wenzelm
parents:
33157
diff
changeset
|
134 |
|
30361
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
wenzelm
parents:
30338
diff
changeset
|
135 |
fun qualified_name "" = empty |
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
wenzelm
parents:
30338
diff
changeset
|
136 |
| qualified_name s = |
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
wenzelm
parents:
30338
diff
changeset
|
137 |
let val (qualifier, name) = split_last (Long_Name.explode s) |
59886 | 138 |
in make_binding (NONE, false, [], map (rpair false) qualifier, name, Position.none) end; |
30361
8ea7a197e2e6
added qualified_name -- emulates old-style qualified bstring;
wenzelm
parents:
30338
diff
changeset
|
139 |
|
28965 | 140 |
|
30222
4102bbf2af21
moved type bstring from name_space.ML to binding.ML -- it is the primitive concept behind bindings;
wenzelm
parents:
30217
diff
changeset
|
141 |
(* 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
|
142 |
|
30276 | 143 |
fun prefix_of (Binding {prefix, ...}) = prefix; |
144 |
||
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
145 |
fun map_prefix f = |
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
146 |
map_binding (fn (restricted, concealed, prefix, qualifier, name, pos) => |
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
147 |
(restricted, concealed, 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
|
148 |
|
30335
b3ef64cadcad
Binding.str_of: removed verbose feature, include qualifier in output;
wenzelm
parents:
30276
diff
changeset
|
149 |
fun prefix _ "" = I |
30410 | 150 |
| prefix mandatory prfx = map_prefix (cons (prfx, mandatory)); |
151 |
||
152 |
||
59858 | 153 |
(* visibility flags *) |
154 |
||
62241 | 155 |
fun restricted default = |
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
156 |
map_binding (fn (restricted, concealed, prefix, qualifier, name, pos) => |
62241 | 157 |
(if is_some restricted then restricted else default, concealed, prefix, qualifier, name, pos)); |
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
158 |
|
59859 | 159 |
val concealed = |
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
160 |
map_binding (fn (restricted, _, prefix, qualifier, name, pos) => |
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
161 |
(restricted, true, prefix, qualifier, name, pos)); |
33157
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
162 |
|
56f836b9414f
allow name space entries to be "concealed" -- via binding/naming/local_theory;
wenzelm
parents:
32590
diff
changeset
|
163 |
|
42381
309ec68442c6
added Binding.print convenience, which includes quote already;
wenzelm
parents:
41254
diff
changeset
|
164 |
(* print *) |
30410 | 165 |
|
43547
f3a8476285c6
clarified Binding.pretty/print: no quotes, only markup -- Binding.str_of is rendered obsolete;
wenzelm
parents:
43546
diff
changeset
|
166 |
fun pretty (Binding {prefix, qualifier, name, pos, ...}) = |
46897
ec793befc232
proper printing of empty binding (again, cf. 93f6f24010c2);
wenzelm
parents:
45666
diff
changeset
|
167 |
if name = "" then Pretty.str "\"\"" |
ec793befc232
proper printing of empty binding (again, cf. 93f6f24010c2);
wenzelm
parents:
45666
diff
changeset
|
168 |
else |
50201
c26369c9eda6
Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents:
48992
diff
changeset
|
169 |
Pretty.markup (Position.markup pos Markup.binding) |
46897
ec793befc232
proper printing of empty binding (again, cf. 93f6f24010c2);
wenzelm
parents:
45666
diff
changeset
|
170 |
[Pretty.str (Long_Name.implode (map #1 (prefix @ qualifier) @ [name]))] |
ec793befc232
proper printing of empty binding (again, cf. 93f6f24010c2);
wenzelm
parents:
45666
diff
changeset
|
171 |
|> Pretty.quote; |
28941 | 172 |
|
61877
276ad4354069
renamed Pretty.str_of to Pretty.unformatted_string_of to emphasize its meaning;
wenzelm
parents:
59990
diff
changeset
|
173 |
val print = Pretty.unformatted_string_of o pretty; |
42381
309ec68442c6
added Binding.print convenience, which includes quote already;
wenzelm
parents:
41254
diff
changeset
|
174 |
|
63335 | 175 |
val _ = ML_system_pp (fn _ => fn _ => Pretty.to_polyml o pretty o reset_pos); |
58032
e92cdae8b3b5
clarified ML toplevel pp: avoid ML output to be attached to inlined binding positions;
wenzelm
parents:
53380
diff
changeset
|
176 |
|
41254
78c3e472bb35
extra checking of name bindings for classes, types, consts;
wenzelm
parents:
39442
diff
changeset
|
177 |
|
78c3e472bb35
extra checking of name bindings for classes, types, consts;
wenzelm
parents:
39442
diff
changeset
|
178 |
(* check *) |
78c3e472bb35
extra checking of name bindings for classes, types, consts;
wenzelm
parents:
39442
diff
changeset
|
179 |
|
48992 | 180 |
fun bad binding = "Bad name binding: " ^ print binding ^ Position.here (pos_of binding); |
41254
78c3e472bb35
extra checking of name bindings for classes, types, consts;
wenzelm
parents:
39442
diff
changeset
|
181 |
|
78c3e472bb35
extra checking of name bindings for classes, types, consts;
wenzelm
parents:
39442
diff
changeset
|
182 |
fun check binding = |
50239 | 183 |
if Symbol_Pos.is_identifier (name_of binding) then () |
41254
78c3e472bb35
extra checking of name bindings for classes, types, consts;
wenzelm
parents:
39442
diff
changeset
|
184 |
else legacy_feature (bad binding); |
78c3e472bb35
extra checking of name bindings for classes, types, consts;
wenzelm
parents:
39442
diff
changeset
|
185 |
|
59874 | 186 |
|
187 |
||
188 |
(** resulting name_spec **) |
|
189 |
||
190 |
val bad_specs = ["", "??", "__"]; |
|
191 |
||
59886 | 192 |
fun name_spec scopes path binding = |
59874 | 193 |
let |
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
194 |
val Binding {restricted, concealed, prefix, qualifier, name, ...} = binding; |
59874 | 195 |
val _ = Long_Name.is_qualified name andalso error (bad binding); |
196 |
||
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
197 |
val restriction = |
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
198 |
(case restricted of |
59939
7d46aa03696e
support for 'restricted' modifier: only qualified accesses outside the local scope;
wenzelm
parents:
59886
diff
changeset
|
199 |
NONE => NONE |
7d46aa03696e
support for 'restricted' modifier: only qualified accesses outside the local scope;
wenzelm
parents:
59886
diff
changeset
|
200 |
| SOME (strict, scope) => if member (op =) scopes scope then NONE else SOME strict); |
59886 | 201 |
|
59874 | 202 |
val spec1 = |
203 |
maps (fn (a, b) => map (rpair b) (Long_Name.explode a)) (path @ prefix @ qualifier); |
|
204 |
val spec2 = if name = "" then [] else [(name, true)]; |
|
205 |
val spec = spec1 @ spec2; |
|
206 |
val _ = |
|
207 |
exists (fn (a, _) => member (op =) bad_specs a orelse exists_string (fn s => s = "\"") a) spec |
|
208 |
andalso error (bad binding); |
|
59990
a81dc82ecba3
clarified keyword 'qualified' in accordance to a similar keyword from Haskell (despite unrelated Binding.qualified in Isabelle/ML);
wenzelm
parents:
59939
diff
changeset
|
209 |
in {restriction = restriction, concealed = concealed, spec = if null spec2 then [] else spec} end; |
59874 | 210 |
|
62663 | 211 |
|
28941 | 212 |
end; |
213 |
||
30214
f84c9f10292a
moved name space externalization flags back to name_space.ML;
wenzelm
parents:
29617
diff
changeset
|
214 |
type binding = Binding.binding; |