src/Pure/General/value.ML
author wenzelm
Fri, 14 Apr 2023 21:34:51 +0200
changeset 77847 3bb6468d202e
parent 77775 3cc55085d490
permissions -rw-r--r--
more operations, following Isabelle/ML conventions;
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
77775
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    34
local
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    35
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    36
val c0 = Char.ord #"0";
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    37
val c9 = Char.ord #"9";
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    38
val minus = Char.ord #"-";
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    39
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    40
in
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    41
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    42
fun parse_int str =
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    43
  let
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    44
    fun err () = raise Fail ("Bad integer " ^ quote str);
77847
3bb6468d202e more operations, following Isabelle/ML conventions;
wenzelm
parents: 77775
diff changeset
    45
    val char = Char.ord o String.nth str;
77775
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    46
    val n = size str;
67218
e62d72699666 more accurate parse_nat/parse_int: avoid corner cases of Int.fromString (e.g. "1.0");
wenzelm
parents: 67000
diff changeset
    47
77775
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    48
    fun digits i a =
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    49
      if i = n then a
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    50
      else
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    51
        let val c = char i
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    52
        in if c0 <= c andalso c <= c9 then digits (i + 1) (10 * a + (c - c0)) else err () end;
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    53
  in
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    54
    if n = 0 then err ()
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    55
    else if char 0 <> minus then digits 0 0
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    56
    else if n = 1 then err ()
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    57
    else ~ (digits 1 0)
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    58
  end;
63806
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    59
77775
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    60
fun parse_nat str =
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    61
  let
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    62
    fun err () = raise Fail ("Bad natural number " ^ quote str);
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    63
    val i = parse_int str handle Fail _ => err ();
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    64
  in if i >= 0 then i else err () end;
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    65
3cc55085d490 minor performance tuning;
wenzelm
parents: 67218
diff changeset
    66
end;
63806
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    67
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    68
val print_int = signed_string_of_int;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    69
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    70
67000
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    71
(* real *)
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    72
63806
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    73
fun parse_real s =
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    74
  (case Real.fromString s of
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    75
    SOME x => x
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    76
  | NONE => raise Fail ("Bad real " ^ quote s));
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    77
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    78
fun print_real x =
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    79
  let val s = signed_string_of_real x in
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    80
    (case space_explode "." s of
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    81
      [a, b] => if forall_string (fn c => c = "0") b then a else s
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    82
    | _ => s)
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    83
  end;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    84
67000
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    85
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    86
(* time *)
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    87
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    88
fun parse_time s =
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    89
  (case Time.fromString s of
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    90
    SOME x => x
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    91
  | 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
    92
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    93
fun print_time x =
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    94
  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
    95
  else Time.toString x;
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 63806
diff changeset
    96
63806
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    97
end;