src/Pure/General/value.ML
author wenzelm
Sat, 04 Nov 2017 12:25:09 +0100
changeset 67000 1698e9ccef2d
parent 63806 c54a53ef1873
child 67218 e62d72699666
permissions -rw-r--r--
more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
63806
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/General/value.ML
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
     3
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
     4
Plain values, represented as string.
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
     5
*)
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
     6
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
     7
signature VALUE =
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
     8
sig
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
     9
  val parse_bool: string -> bool
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    10
  val print_bool: bool -> string
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    11
  val parse_nat: string -> int
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    12
  val parse_int: string -> int
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    13
  val print_int: int -> string
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    14
  val parse_real: string -> real
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    15
  val print_real: real -> string
67000
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    16
  val parse_time: string -> Time.time
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    17
  val print_time: Time.time -> string
63806
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    18
end;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    19
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    20
structure Value: VALUE =
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    21
struct
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    22
67000
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    23
(* bool *)
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    24
63806
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    25
fun parse_bool "true" = true
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    26
  | parse_bool "false" = false
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    27
  | parse_bool s = raise Fail ("Bad boolean " ^ quote s);
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    28
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    29
val print_bool = Bool.toString;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    30
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    31
67000
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    32
(* nat and int *)
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    33
63806
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    34
fun parse_nat s =
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    35
  let val i = Int.fromString s in
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    36
    if is_none i orelse the i < 0
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    37
    then raise Fail ("Bad natural number " ^ quote s)
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    38
    else the i
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    39
  end;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    40
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    41
fun parse_int s =
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    42
  let val i = Int.fromString s in
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    43
    if is_none i orelse String.isPrefix "~" s
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    44
    then raise Fail ("Bad integer " ^ quote s)
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    45
    else the i
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    46
  end;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    47
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    48
val print_int = signed_string_of_int;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    49
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    50
67000
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    51
(* real *)
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    52
63806
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    53
fun parse_real s =
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    54
  (case Real.fromString s of
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    55
    SOME x => x
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    56
  | NONE => raise Fail ("Bad real " ^ quote s));
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    57
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    58
fun print_real x =
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    59
  let val s = signed_string_of_real x in
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    60
    (case space_explode "." s of
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    61
      [a, b] => if forall_string (fn c => c = "0") b then a else s
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    62
    | _ => s)
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    63
  end;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    64
67000
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    65
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    66
(* time *)
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    67
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    68
fun parse_time s =
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    69
  (case Time.fromString s of
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    70
    SOME x => x
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    71
  | NONE => raise Fail ("Bad time " ^ quote s));
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    72
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    73
fun print_time x =
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    74
  if x < Time.zeroTime then "-" ^ Time.toString (Time.zeroTime - x)
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    75
  else Time.toString x;
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    76
63806
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    77
end;