haftmann@28939
|
1 |
(* Title: Pure/General/binding.ML
|
haftmann@28939
|
2 |
Author: Florian Haftmann, TU Muenchen
|
wenzelm@30218
|
3 |
Author: Makarius
|
haftmann@28939
|
4 |
|
haftmann@28939
|
5 |
Structured name bindings.
|
haftmann@28939
|
6 |
*)
|
haftmann@28939
|
7 |
|
wenzelm@30226
|
8 |
type bstring = string; (*primitive names to be bound*)
|
wenzelm@30226
|
9 |
|
wenzelm@30218
|
10 |
signature BINDING =
|
haftmann@28939
|
11 |
sig
|
haftmann@29581
|
12 |
type binding
|
wenzelm@30276
|
13 |
val dest: binding -> (string * bool) list * bstring
|
wenzelm@30232
|
14 |
val verbose: bool ref
|
wenzelm@30221
|
15 |
val str_of: binding -> string
|
wenzelm@30226
|
16 |
val make: bstring * Position.T -> binding
|
wenzelm@30276
|
17 |
val pos_of: binding -> Position.T
|
wenzelm@30226
|
18 |
val name: bstring -> binding
|
wenzelm@30226
|
19 |
val name_of: binding -> string
|
wenzelm@30226
|
20 |
val map_name: (bstring -> bstring) -> binding -> binding
|
wenzelm@29617
|
21 |
val empty: binding
|
wenzelm@30226
|
22 |
val is_empty: binding -> bool
|
wenzelm@30226
|
23 |
val qualify: bool -> string -> binding -> binding
|
wenzelm@30276
|
24 |
val prefix_of: binding -> (string * bool) list
|
wenzelm@30226
|
25 |
val map_prefix: ((string * bool) list -> (string * bool) list) -> binding -> binding
|
wenzelm@29617
|
26 |
val add_prefix: bool -> string -> binding -> binding
|
wenzelm@29617
|
27 |
end;
|
haftmann@28939
|
28 |
|
wenzelm@30221
|
29 |
structure Binding: BINDING =
|
haftmann@28939
|
30 |
struct
|
haftmann@28939
|
31 |
|
wenzelm@30226
|
32 |
(** representation **)
|
haftmann@29338
|
33 |
|
wenzelm@30226
|
34 |
(* datatype *)
|
haftmann@29338
|
35 |
|
wenzelm@30226
|
36 |
datatype binding = Binding of
|
wenzelm@30276
|
37 |
{prefix: (string * bool) list, (*system prefix*)
|
wenzelm@30276
|
38 |
qualifier: (string * bool) list, (*user qualifier*)
|
wenzelm@30276
|
39 |
name: bstring, (*base name*)
|
wenzelm@30276
|
40 |
pos: Position.T}; (*source position*)
|
haftmann@29338
|
41 |
|
wenzelm@30226
|
42 |
fun make_binding (prefix, qualifier, name, pos) =
|
wenzelm@30226
|
43 |
Binding {prefix = prefix, qualifier = qualifier, name = name, pos = pos};
|
haftmann@28939
|
44 |
|
wenzelm@30226
|
45 |
fun map_binding f (Binding {prefix, qualifier, name, pos}) =
|
wenzelm@30226
|
46 |
make_binding (f (prefix, qualifier, name, pos));
|
haftmann@28939
|
47 |
|
wenzelm@30276
|
48 |
fun dest (Binding {prefix, qualifier, name, ...}) = (prefix @ qualifier, name);
|
wenzelm@30226
|
49 |
|
wenzelm@30226
|
50 |
|
wenzelm@30226
|
51 |
(* diagnostic output *)
|
wenzelm@30226
|
52 |
|
wenzelm@30232
|
53 |
val verbose = ref false;
|
wenzelm@30232
|
54 |
|
wenzelm@30226
|
55 |
val str_of_components = implode o map (fn (s, true) => s ^ "!" | (s, false) => s ^ "?");
|
wenzelm@30226
|
56 |
|
wenzelm@30226
|
57 |
fun str_of (Binding {prefix, qualifier, name, pos}) =
|
wenzelm@30221
|
58 |
let
|
wenzelm@30226
|
59 |
val text =
|
wenzelm@30232
|
60 |
if ! verbose then
|
wenzelm@30232
|
61 |
(if null prefix then "" else enclose "(" ")" (str_of_components prefix)) ^
|
wenzelm@30232
|
62 |
str_of_components qualifier ^ name
|
wenzelm@30232
|
63 |
else name;
|
wenzelm@30226
|
64 |
val props = Position.properties_of pos;
|
wenzelm@30226
|
65 |
in Markup.markup (Markup.properties props (Markup.binding name)) text end;
|
wenzelm@30221
|
66 |
|
wenzelm@30221
|
67 |
|
wenzelm@30226
|
68 |
|
wenzelm@30226
|
69 |
(** basic operations **)
|
wenzelm@30226
|
70 |
|
wenzelm@30226
|
71 |
(* name and position *)
|
wenzelm@30226
|
72 |
|
wenzelm@30226
|
73 |
fun make (name, pos) = make_binding ([], [], name, pos);
|
wenzelm@30226
|
74 |
fun name name = make (name, Position.none);
|
wenzelm@30226
|
75 |
|
wenzelm@30226
|
76 |
fun pos_of (Binding {pos, ...}) = pos;
|
wenzelm@30226
|
77 |
fun name_of (Binding {name, ...}) = name;
|
wenzelm@30226
|
78 |
|
wenzelm@30226
|
79 |
fun map_name f = map_binding (fn (prefix, qualifier, name, pos) => (prefix, qualifier, f name, pos));
|
wenzelm@30226
|
80 |
|
haftmann@28965
|
81 |
val empty = name "";
|
wenzelm@30226
|
82 |
fun is_empty b = name_of b = "";
|
haftmann@28939
|
83 |
|
haftmann@28939
|
84 |
|
wenzelm@30226
|
85 |
(* user qualifier *)
|
haftmann@28965
|
86 |
|
wenzelm@30226
|
87 |
fun qualify _ "" = I
|
wenzelm@30226
|
88 |
| qualify mandatory qual = map_binding (fn (prefix, qualifier, name, pos) =>
|
wenzelm@30226
|
89 |
(prefix, (qual, mandatory) :: qualifier, name, pos));
|
haftmann@28965
|
90 |
|
haftmann@28939
|
91 |
|
wenzelm@30226
|
92 |
(* system prefix *)
|
haftmann@28939
|
93 |
|
wenzelm@30276
|
94 |
fun prefix_of (Binding {prefix, ...}) = prefix;
|
wenzelm@30276
|
95 |
|
wenzelm@30226
|
96 |
fun map_prefix f = map_binding (fn (prefix, qualifier, name, pos) =>
|
wenzelm@30226
|
97 |
(f prefix, qualifier, name, pos));
|
haftmann@28965
|
98 |
|
wenzelm@30226
|
99 |
fun add_prefix _ "" = I
|
wenzelm@30226
|
100 |
| add_prefix mandatory prfx = map_prefix (cons (prfx, mandatory));
|
haftmann@28939
|
101 |
|
haftmann@28939
|
102 |
end;
|
haftmann@28939
|
103 |
|
wenzelm@30218
|
104 |
type binding = Binding.binding;
|
wenzelm@30218
|
105 |
|