src/Pure/General/binding.ML
author wenzelm
Thu, 05 Mar 2009 10:52:07 +0100
changeset 30276 51b92d34af79
parent 30242 aea5d7fa7ef5
child 30341 b3ef64cadcad
permissions -rw-r--r--
added prefix_of;
tuned signature;
tuned;
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