src/Pure/General/binding.ML
changeset 30335 b3ef64cadcad
parent 30276 51b92d34af79
child 30338 51d488f3dd72
equal deleted inserted replaced
30334:a2f236a717fa 30335:b3ef64cadcad
     9 
     9 
    10 signature BINDING =
    10 signature BINDING =
    11 sig
    11 sig
    12   type binding
    12   type binding
    13   val dest: binding -> (string * bool) list * bstring
    13   val dest: binding -> (string * bool) list * bstring
    14   val verbose: bool ref
       
    15   val str_of: binding -> string
    14   val str_of: binding -> string
    16   val make: bstring * Position.T -> binding
    15   val make: bstring * Position.T -> binding
    17   val pos_of: binding -> Position.T
    16   val pos_of: binding -> Position.T
    18   val name: bstring -> binding
    17   val name: bstring -> binding
    19   val name_of: binding -> string
    18   val name_of: binding -> string
    21   val empty: binding
    20   val empty: binding
    22   val is_empty: binding -> bool
    21   val is_empty: binding -> bool
    23   val qualify: bool -> string -> binding -> binding
    22   val qualify: bool -> string -> binding -> binding
    24   val prefix_of: binding -> (string * bool) list
    23   val prefix_of: binding -> (string * bool) list
    25   val map_prefix: ((string * bool) list -> (string * bool) list) -> binding -> binding
    24   val map_prefix: ((string * bool) list -> (string * bool) list) -> binding -> binding
    26   val add_prefix: bool -> string -> binding -> binding
    25   val prefix: bool -> string -> binding -> binding
    27 end;
    26 end;
    28 
    27 
    29 structure Binding: BINDING =
    28 structure Binding: BINDING =
    30 struct
    29 struct
    31 
    30 
    45 fun map_binding f (Binding {prefix, qualifier, name, pos}) =
    44 fun map_binding f (Binding {prefix, qualifier, name, pos}) =
    46   make_binding (f (prefix, qualifier, name, pos));
    45   make_binding (f (prefix, qualifier, name, pos));
    47 
    46 
    48 fun dest (Binding {prefix, qualifier, name, ...}) = (prefix @ qualifier, name);
    47 fun dest (Binding {prefix, qualifier, name, ...}) = (prefix @ qualifier, name);
    49 
    48 
    50 
       
    51 (* diagnostic output *)
       
    52 
       
    53 val verbose = ref false;
       
    54 
       
    55 val str_of_components = implode o map (fn (s, true) => s ^ "!" | (s, false) => s ^ "?");
       
    56 
       
    57 fun str_of (Binding {prefix, qualifier, name, pos}) =
    49 fun str_of (Binding {prefix, qualifier, name, pos}) =
    58   let
    50   let
    59     val text =
    51     val text = space_implode "." (map #1 qualifier @ [name]);
    60       if ! verbose then
       
    61         (if null prefix then "" else enclose "(" ")" (str_of_components prefix)) ^
       
    62           str_of_components qualifier ^ name
       
    63       else name;
       
    64     val props = Position.properties_of pos;
    52     val props = Position.properties_of pos;
    65   in Markup.markup (Markup.properties props (Markup.binding name)) text end;
    53   in Markup.markup (Markup.properties props (Markup.binding name)) text end;
    66 
    54 
    67 
    55 
    68 
    56 
    83 
    71 
    84 
    72 
    85 (* user qualifier *)
    73 (* user qualifier *)
    86 
    74 
    87 fun qualify _ "" = I
    75 fun qualify _ "" = I
    88   | qualify mandatory qual = map_binding (fn (prefix, qualifier, name, pos) =>
    76   | qualify strict qual = map_binding (fn (prefix, qualifier, name, pos) =>
    89       (prefix, (qual, mandatory) :: qualifier, name, pos));
    77       (prefix, (qual, strict) :: qualifier, name, pos));
    90 
    78 
    91 
    79 
    92 (* system prefix *)
    80 (* system prefix *)
    93 
    81 
    94 fun prefix_of (Binding {prefix, ...}) = prefix;
    82 fun prefix_of (Binding {prefix, ...}) = prefix;
    95 
    83 
    96 fun map_prefix f = map_binding (fn (prefix, qualifier, name, pos) =>
    84 fun map_prefix f = map_binding (fn (prefix, qualifier, name, pos) =>
    97   (f prefix, qualifier, name, pos));
    85   (f prefix, qualifier, name, pos));
    98 
    86 
    99 fun add_prefix _ "" = I
    87 fun prefix _ "" = I
   100   | add_prefix mandatory prfx = map_prefix (cons (prfx, mandatory));
    88   | prefix strict prfx = map_prefix (cons (prfx, strict));
   101 
    89 
   102 end;
    90 end;
   103 
    91 
   104 type binding = Binding.binding;
    92 type binding = Binding.binding;
   105 
    93