src/Pure/General/value.ML
author wenzelm
Sun, 21 May 2017 23:41:46 +0200
changeset 65895 744878d72021
parent 63806 c54a53ef1873
child 67000 1698e9ccef2d
permissions -rw-r--r--
more general workaround for failed sessions (again, see also 2edb89630a80, ed7b5cd3a7f2);
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
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    16
end;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    17
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    18
structure Value: VALUE =
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    19
struct
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    20
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    21
fun parse_bool "true" = true
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    22
  | parse_bool "false" = false
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    23
  | parse_bool s = raise Fail ("Bad boolean " ^ quote s);
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    24
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    25
val print_bool = Bool.toString;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    26
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    27
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    28
fun parse_nat s =
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    29
  let val i = Int.fromString s in
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    30
    if is_none i orelse the i < 0
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    31
    then raise Fail ("Bad natural number " ^ quote s)
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    32
    else the i
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    33
  end;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    34
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    35
fun parse_int s =
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    36
  let val i = Int.fromString s in
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    37
    if is_none i orelse String.isPrefix "~" s
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    38
    then raise Fail ("Bad integer " ^ quote s)
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    39
    else the i
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    40
  end;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    41
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    42
val print_int = signed_string_of_int;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    43
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    44
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    45
fun parse_real s =
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    46
  (case Real.fromString s of
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    47
    SOME x => x
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    48
  | NONE => raise Fail ("Bad real " ^ quote s));
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    49
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    50
fun print_real x =
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    51
  let val s = signed_string_of_real x in
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    52
    (case space_explode "." s of
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    53
      [a, b] => if forall_string (fn c => c = "0") b then a else s
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    54
    | _ => s)
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    55
  end;
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    56
c54a53ef1873 clarified modules;
wenzelm
parents:
diff changeset
    57
end;