src/Pure/ML/ml_env.ML
author wenzelm
Mon, 01 Jun 2009 23:28:04 +0200
changeset 31331 e44f1e4fa1f4
parent 31328 0d3aa0aeb96f
child 31430 04192aa43112
permissions -rw-r--r--
tuned signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31325
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/ML/ml_env.ML
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
     3
31328
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
     4
Local environment of ML sources and results.
31325
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
     5
*)
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
     6
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
     7
signature ML_ENV =
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
     8
sig
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
     9
  val inherit: Context.generic -> Context.generic -> Context.generic
31328
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    10
  val register_tokens: ML_Lex.token list -> Context.generic ->
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    11
    (serial * ML_Lex.token) list * Context.generic
31331
e44f1e4fa1f4 tuned signature;
wenzelm
parents: 31328
diff changeset
    12
  val token_position: Context.generic -> serial -> Position.T option
31325
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    13
  val name_space: ML_Name_Space.T
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    14
  val local_context: use_context
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    15
end
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    16
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    17
structure ML_Env: ML_ENV =
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    18
struct
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    19
31328
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    20
(* context data *)
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    21
31325
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    22
structure Env = GenericDataFun
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    23
(
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    24
  type T =
31328
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    25
    Position.T Inttab.table *
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    26
     (ML_Name_Space.valueVal Symtab.table *
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    27
      ML_Name_Space.typeVal Symtab.table *
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    28
      ML_Name_Space.fixityVal Symtab.table *
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    29
      ML_Name_Space.structureVal Symtab.table *
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    30
      ML_Name_Space.signatureVal Symtab.table *
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    31
      ML_Name_Space.functorVal Symtab.table);
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    32
  val empty =
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    33
    (Inttab.empty,
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    34
      (Symtab.empty, Symtab.empty, Symtab.empty, Symtab.empty, Symtab.empty, Symtab.empty));
31325
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    35
  val extend = I;
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    36
  fun merge _
31328
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    37
   ((toks1, (val1, type1, fixity1, structure1, signature1, functor1)),
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    38
    (toks2, (val2, type2, fixity2, structure2, signature2, functor2))) : T =
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    39
   (Inttab.merge (K true) (toks1, toks2),
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    40
    (Symtab.merge (K true) (val1, val2),
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    41
     Symtab.merge (K true) (type1, type2),
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    42
     Symtab.merge (K true) (fixity1, fixity2),
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    43
     Symtab.merge (K true) (structure1, structure2),
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    44
     Symtab.merge (K true) (signature1, signature2),
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    45
     Symtab.merge (K true) (functor1, functor2)));
31325
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    46
);
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    47
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    48
val inherit = Env.put o Env.get;
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    49
31328
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    50
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    51
(* source tokens *)
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    52
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    53
fun register_tokens toks context =
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    54
  let
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    55
    val regs = map (fn tok => (serial (), tok)) toks;
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    56
    val context' = context
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    57
      |> Env.map (apfst (fold (fn (i, tok) => Inttab.update (i, ML_Lex.pos_of tok)) regs));
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    58
  in (regs, context') end;
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    59
31331
e44f1e4fa1f4 tuned signature;
wenzelm
parents: 31328
diff changeset
    60
val token_position = Inttab.lookup o #1 o Env.get;
31328
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    61
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    62
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    63
(* results *)
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    64
31325
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    65
val name_space: ML_Name_Space.T =
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    66
  let
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    67
    fun lookup sel1 sel2 name =
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    68
      Context.thread_data ()
31328
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    69
      |> (fn NONE => NONE | SOME context => Symtab.lookup (sel1 (#2 (Env.get context))) name)
31325
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    70
      |> (fn NONE => sel2 ML_Name_Space.global name | some => some);
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    71
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    72
    fun all sel1 sel2 () =
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    73
      Context.thread_data ()
31328
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    74
      |> (fn NONE => [] | SOME context => Symtab.dest (sel1 (#2 (Env.get context))))
31325
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    75
      |> append (sel2 ML_Name_Space.global ())
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    76
      |> sort_distinct (string_ord o pairself #1);
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    77
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    78
    fun enter ap1 sel2 entry =
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    79
      if is_some (Context.thread_data ()) then
31328
0d3aa0aeb96f maintain tokens within common ML environment;
wenzelm
parents: 31325
diff changeset
    80
        Context.>> (Env.map (apsnd (ap1 (Symtab.update entry))))
31325
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    81
      else sel2 ML_Name_Space.global entry;
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    82
  in
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    83
   {lookupVal    = lookup #1 #lookupVal,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    84
    lookupType   = lookup #2 #lookupType,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    85
    lookupFix    = lookup #3 #lookupFix,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    86
    lookupStruct = lookup #4 #lookupStruct,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    87
    lookupSig    = lookup #5 #lookupSig,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    88
    lookupFunct  = lookup #6 #lookupFunct,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    89
    enterVal     = enter (fn h => fn (a, b, c, d, e, f) => (h a, b, c, d, e, f)) #enterVal,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    90
    enterType    = enter (fn h => fn (a, b, c, d, e, f) => (a, h b, c, d, e, f)) #enterType,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    91
    enterFix     = enter (fn h => fn (a, b, c, d, e, f) => (a, b, h c, d, e, f)) #enterFix,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    92
    enterStruct  = enter (fn h => fn (a, b, c, d, e, f) => (a, b, c, h d, e, f)) #enterStruct,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    93
    enterSig     = enter (fn h => fn (a, b, c, d, e, f) => (a, b, c, d, h e, f)) #enterSig,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    94
    enterFunct   = enter (fn h => fn (a, b, c, d, e, f) => (a, b, c, d, e, h f)) #enterFunct,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    95
    allVal       = all #1 #allVal,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    96
    allType      = all #2 #allType,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    97
    allFix       = all #3 #allFix,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    98
    allStruct    = all #4 #allStruct,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
    99
    allSig       = all #5 #allSig,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
   100
    allFunct     = all #6 #allFunct}
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
   101
  end;
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
   102
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
   103
val local_context: use_context =
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
   104
 {tune_source = ML_Parse.fix_ints,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
   105
  name_space = name_space,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
   106
  str_of_pos = Position.str_of oo Position.line_file,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
   107
  print = writeln,
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
   108
  error = error};
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
   109
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
   110
end;
700951b53d21 moved local ML environment to separate module ML_Env;
wenzelm
parents:
diff changeset
   111