src/Pure/System/options.ML
author wenzelm
Fri, 01 Apr 2016 16:31:54 +0200
changeset 62791 64ebecf8646c
parent 62712 22a17cec2efe
child 62875 5a0c06491974
permissions -rw-r--r--
more operations (cf. Scala version);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/System/options.ML
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
     3
51945
5b1ac9843f02 tuned comments;
wenzelm
parents: 51943
diff changeset
     4
System options with external string representation.
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
     5
*)
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
     6
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
     7
signature OPTIONS =
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
     8
sig
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
     9
  val boolT: string
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    10
  val intT: string
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    11
  val realT: string
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    12
  val stringT: string
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    13
  val unknownT: string
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    14
  type T
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    15
  val empty: T
59812
675d0c692c41 semantic completion for @{system_option};
wenzelm
parents: 56467
diff changeset
    16
  val names: T -> string list
56467
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    17
  val markup: T -> string * Position.T -> Markup.T
51942
527e39becafc more systematic access to options default;
wenzelm
parents: 48698
diff changeset
    18
  val typ: T -> string -> string
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    19
  val bool: T -> string -> bool
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    20
  val int: T -> string -> int
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    21
  val real: T -> string -> real
62791
64ebecf8646c more operations (cf. Scala version);
wenzelm
parents: 62712
diff changeset
    22
  val seconds: T -> string -> Time.time
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    23
  val string: T -> string -> string
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    24
  val put_bool: string -> bool -> T -> T
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    25
  val put_int: string -> int -> T -> T
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    26
  val put_real: string -> real -> T -> T
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    27
  val put_string: string -> string -> T -> T
56465
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
    28
  val declare: {pos: Position.T, name: string, typ: string, value: string} -> T -> T
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    29
  val update: string -> string -> T -> T
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    30
  val decode: XML.body -> T
48698
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
    31
  val default: unit -> T
56467
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    32
  val default_markup: string * Position.T -> Markup.T
51946
449fbf64f4a5 tuned signature;
wenzelm
parents: 51945
diff changeset
    33
  val default_typ: string -> string
51942
527e39becafc more systematic access to options default;
wenzelm
parents: 48698
diff changeset
    34
  val default_bool: string -> bool
527e39becafc more systematic access to options default;
wenzelm
parents: 48698
diff changeset
    35
  val default_int: string -> int
527e39becafc more systematic access to options default;
wenzelm
parents: 48698
diff changeset
    36
  val default_real: string -> real
62791
64ebecf8646c more operations (cf. Scala version);
wenzelm
parents: 62712
diff changeset
    37
  val default_seconds: string -> Time.time
51942
527e39becafc more systematic access to options default;
wenzelm
parents: 48698
diff changeset
    38
  val default_string: string -> string
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    39
  val default_put_bool: string -> bool -> unit
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    40
  val default_put_int: string -> int -> unit
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    41
  val default_put_real: string -> real -> unit
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    42
  val default_put_string: string -> string -> unit
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    43
  val get_default: string -> string
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    44
  val put_default: string -> string -> unit
48698
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
    45
  val set_default: T -> unit
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
    46
  val reset_default: unit -> unit
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
    47
  val load_default: unit -> unit
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    48
end;
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    49
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    50
structure Options: OPTIONS =
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    51
struct
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    52
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    53
(* representation *)
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    54
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    55
val boolT = "bool";
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    56
val intT = "int";
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    57
val realT = "real";
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    58
val stringT = "string";
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    59
val unknownT = "unknown";
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    60
56465
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
    61
datatype T = Options of {pos: Position.T, typ: string, value: string} Symtab.table;
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    62
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    63
val empty = Options Symtab.empty;
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    64
59812
675d0c692c41 semantic completion for @{system_option};
wenzelm
parents: 56467
diff changeset
    65
fun names (Options tab) = sort_strings (Symtab.keys tab);
675d0c692c41 semantic completion for @{system_option};
wenzelm
parents: 56467
diff changeset
    66
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
    67
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    68
(* check *)
51942
527e39becafc more systematic access to options default;
wenzelm
parents: 48698
diff changeset
    69
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    70
fun check_name (Options tab) name =
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    71
  let val opt = Symtab.lookup tab name in
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    72
    if is_some opt andalso #typ (the opt) <> unknownT then the opt
51978
237ee582d663 tuned messages;
wenzelm
parents: 51951
diff changeset
    73
    else error ("Unknown system option " ^ quote name)
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    74
  end;
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    75
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    76
fun check_type options name typ =
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    77
  let val opt = check_name options name in
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    78
    if #typ opt = typ then opt
51978
237ee582d663 tuned messages;
wenzelm
parents: 51951
diff changeset
    79
    else error ("Ill-typed system option " ^ quote name ^ " : " ^ #typ opt ^ " vs. " ^ typ)
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    80
  end;
51942
527e39becafc more systematic access to options default;
wenzelm
parents: 48698
diff changeset
    81
527e39becafc more systematic access to options default;
wenzelm
parents: 48698
diff changeset
    82
56467
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    83
(* markup *)
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    84
56467
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    85
fun markup options (name, pos) =
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    86
  let
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    87
    val opt =
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    88
      check_name options name
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    89
        handle ERROR msg => error (msg ^ Position.here pos);
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    90
    val props = Position.def_properties_of (#pos opt);
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    91
  in Markup.properties props (Markup.entity Markup.system_optionN name) end;
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    92
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    93
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    94
(* typ *)
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
    95
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    96
fun typ options name = #typ (check_name options name);
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    97
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    98
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
    99
(* basic operations *)
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   100
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   101
fun put T print name x (options as Options tab) =
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   102
  let val opt = check_type options name T
56465
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   103
  in Options (Symtab.update (name, {pos = #pos opt, typ = #typ opt, value = print x}) tab) end;
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   104
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   105
fun get T parse options name =
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   106
  let val opt = check_type options name T in
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   107
    (case parse (#value opt) of
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   108
      SOME x => x
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   109
    | NONE =>
51978
237ee582d663 tuned messages;
wenzelm
parents: 51951
diff changeset
   110
        error ("Malformed value for system option " ^ quote name ^
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   111
          " : " ^ T ^ " =\n" ^ quote (#value opt)))
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   112
  end;
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   113
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   114
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   115
(* internal lookup and update *)
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   116
51951
fab4ab92e812 more standard Isabelle/ML operations -- avoid inaccurate Bool.fromString;
wenzelm
parents: 51946
diff changeset
   117
val bool = get boolT (try Markup.parse_bool);
fab4ab92e812 more standard Isabelle/ML operations -- avoid inaccurate Bool.fromString;
wenzelm
parents: 51946
diff changeset
   118
val int = get intT (try Markup.parse_int);
51988
a9725750c53a more uniform Markup.parse_real;
wenzelm
parents: 51978
diff changeset
   119
val real = get realT (try Markup.parse_real);
62791
64ebecf8646c more operations (cf. Scala version);
wenzelm
parents: 62712
diff changeset
   120
val seconds = Time.fromReal oo real;
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   121
val string = get stringT SOME;
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   122
51951
fab4ab92e812 more standard Isabelle/ML operations -- avoid inaccurate Bool.fromString;
wenzelm
parents: 51946
diff changeset
   123
val put_bool = put boolT Markup.print_bool;
fab4ab92e812 more standard Isabelle/ML operations -- avoid inaccurate Bool.fromString;
wenzelm
parents: 51946
diff changeset
   124
val put_int = put intT Markup.print_int;
51990
cc66addbba6d more uniform Markup.print_real;
wenzelm
parents: 51988
diff changeset
   125
val put_real = put realT Markup.print_real;
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   126
val put_string = put stringT I;
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   127
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   128
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   129
(* external updates *)
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   130
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   131
fun check_value options name =
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   132
  let val opt = check_name options name in
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   133
    if #typ opt = boolT then ignore (bool options name)
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   134
    else if #typ opt = intT then ignore (int options name)
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   135
    else if #typ opt = realT then ignore (real options name)
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   136
    else if #typ opt = stringT then ignore (string options name)
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   137
    else ()
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   138
  end;
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   139
56465
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   140
fun declare {pos, name, typ, value} (Options tab) =
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   141
  let
56465
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   142
    val options' =
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   143
      (case Symtab.lookup tab name of
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   144
        SOME other =>
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   145
          error ("Duplicate declaration of system option " ^ quote name ^ Position.here pos ^
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   146
            Position.here (#pos other))
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   147
      | NONE => Options (Symtab.update (name, {pos = pos, typ = typ, value = value}) tab));
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   148
    val _ =
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   149
      typ = boolT orelse typ = intT orelse typ = realT orelse typ = stringT orelse
56465
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   150
        error ("Unknown type for system option " ^ quote name ^ " : " ^ quote typ ^
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   151
          Position.here pos);
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   152
    val _ = check_value options' name;
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   153
  in options' end;
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   154
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   155
fun update name value (options as Options tab) =
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   156
  let
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   157
    val opt = check_name options name;
56465
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   158
    val options' =
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   159
      Options (Symtab.update (name, {pos = #pos opt, typ = #typ opt, value = value}) tab);
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   160
    val _ = check_value options' name;
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   161
  in options' end;
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   162
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   163
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   164
(* decode *)
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   165
56465
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   166
fun decode_opt body =
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   167
  let open XML.Decode
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   168
  in list (pair properties (pair string (pair string string))) end body
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   169
  |> map (fn (props, (name, (typ, value))) =>
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   170
      {pos = Position.of_properties props, name = name, typ = typ, value = value});
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   171
6ad693903e22 more positions and markup;
wenzelm
parents: 51990
diff changeset
   172
fun decode body = fold declare (decode_opt body) empty;
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   173
48698
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   174
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   175
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   176
(** global default **)
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   177
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   178
val global_default = Synchronized.var "Options.default" (NONE: T option);
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   179
51978
237ee582d663 tuned messages;
wenzelm
parents: 51951
diff changeset
   180
fun err_no_default () = error "Missing default for system options within Isabelle process";
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   181
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   182
fun change_default f x y =
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   183
  Synchronized.change global_default
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   184
    (fn SOME options => SOME (f x y options)
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   185
      | NONE => err_no_default ());
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   186
48698
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   187
fun default () =
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   188
  (case Synchronized.value global_default of
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   189
    SOME options => options
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   190
  | NONE => err_no_default ());
48698
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   191
56467
8d7d6f17c6a7 more uniform ML/document antiquotations;
wenzelm
parents: 56465
diff changeset
   192
fun default_markup arg = markup (default ()) arg;
51946
449fbf64f4a5 tuned signature;
wenzelm
parents: 51945
diff changeset
   193
fun default_typ name = typ (default ()) name;
51942
527e39becafc more systematic access to options default;
wenzelm
parents: 48698
diff changeset
   194
fun default_bool name = bool (default ()) name;
527e39becafc more systematic access to options default;
wenzelm
parents: 48698
diff changeset
   195
fun default_int name = int (default ()) name;
527e39becafc more systematic access to options default;
wenzelm
parents: 48698
diff changeset
   196
fun default_real name = real (default ()) name;
62791
64ebecf8646c more operations (cf. Scala version);
wenzelm
parents: 62712
diff changeset
   197
fun default_seconds name = seconds (default ()) name;
51942
527e39becafc more systematic access to options default;
wenzelm
parents: 48698
diff changeset
   198
fun default_string name = string (default ()) name;
527e39becafc more systematic access to options default;
wenzelm
parents: 48698
diff changeset
   199
51943
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   200
val default_put_bool = change_default put_bool;
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   201
val default_put_int = change_default put_int;
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   202
val default_put_real = change_default put_real;
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   203
val default_put_string = change_default put_string;
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   204
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   205
fun get_default name =
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   206
  let val options = default () in get (typ options name) SOME options name end;
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   207
val put_default = change_default update;
3278729bfa38 more operations in accordance to Scala version;
wenzelm
parents: 51942
diff changeset
   208
48698
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   209
fun set_default options = Synchronized.change global_default (K (SOME options));
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   210
fun reset_default () = Synchronized.change global_default (K NONE);
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   211
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   212
fun load_default () =
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   213
  (case getenv "ISABELLE_PROCESS_OPTIONS" of
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   214
    "" => ()
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   215
  | name =>
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   216
      let val path = Path.explode name in
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   217
        (case try File.read path of
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   218
          SOME s => (set_default (decode (YXML.parse_body s)); ignore (try File.rm path))
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   219
        | NONE => ())
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   220
      end);
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   221
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   222
val _ = load_default ();
62712
22a17cec2efe clarified use of options;
wenzelm
parents: 59812
diff changeset
   223
val _ = ML_Pretty.print_depth (default_int "ML_print_depth");
48698
2585042b1a30 pass Isabelle/Scala system options into ML process of Isar tty or build jobs;
wenzelm
parents: 48456
diff changeset
   224
48456
d8ff14f44a40 added ML version of stand-alone options, with XML.encode/decode operations (unidirectional from Scala to ML);
wenzelm
parents:
diff changeset
   225
end;