src/Pure/ML/ml_syntax.scala
author wenzelm
Wed, 15 Jul 2020 11:56:43 +0200
changeset 72034 452073b64f28
parent 71601 97ccf48c2f0c
child 75393 87ebf5a50283
permissions -rw-r--r--
clarified signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62528
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/ML/ml_syntax.scala
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
     3
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
     4
Concrete ML syntax for basic values.
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
     5
*/
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
     6
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
     7
package isabelle
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
     8
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
     9
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    10
object ML_Syntax
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    11
{
72034
452073b64f28 clarified signature;
wenzelm
parents: 71601
diff changeset
    12
  /* numbers */
62709
fe3d50448833 more operations;
wenzelm
parents: 62638
diff changeset
    13
72034
452073b64f28 clarified signature;
wenzelm
parents: 71601
diff changeset
    14
  private def signed(s: String): String =
62717
wenzelm
parents: 62709
diff changeset
    15
    if (s(0) == '-') "~" + s.substring(1) else s
62709
fe3d50448833 more operations;
wenzelm
parents: 62638
diff changeset
    16
72034
452073b64f28 clarified signature;
wenzelm
parents: 71601
diff changeset
    17
  def print_int(x: Int): String = signed(Value.Int(x))
452073b64f28 clarified signature;
wenzelm
parents: 71601
diff changeset
    18
  def print_long(x: Long): String = signed(Value.Long(x))
452073b64f28 clarified signature;
wenzelm
parents: 71601
diff changeset
    19
  def print_double(x: Double): String = signed(Value.Double(x))
62709
fe3d50448833 more operations;
wenzelm
parents: 62638
diff changeset
    20
fe3d50448833 more operations;
wenzelm
parents: 62638
diff changeset
    21
fe3d50448833 more operations;
wenzelm
parents: 62638
diff changeset
    22
  /* string */
fe3d50448833 more operations;
wenzelm
parents: 62638
diff changeset
    23
66782
193c31b79a33 clarified signature;
wenzelm
parents: 65431
diff changeset
    24
  private def print_byte(c: Byte): String =
62528
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    25
    c match {
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    26
      case 34 => "\\\""
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    27
      case 92 => "\\\\"
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    28
      case 9 => "\\t"
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    29
      case 10 => "\\n"
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    30
      case 12 => "\\f"
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    31
      case 13 => "\\r"
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    32
      case _ =>
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    33
        if (c < 0) "\\" + Library.signed_string_of_int(256 + c)
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    34
        else if (c < 32) new String(Array[Char](92, 94, (c + 64).toChar))
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    35
        else if (c < 127) Symbol.ascii(c.toChar)
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    36
        else "\\" + Library.signed_string_of_int(c)
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    37
    }
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    38
66782
193c31b79a33 clarified signature;
wenzelm
parents: 65431
diff changeset
    39
  private def print_symbol(s: Symbol.Symbol): String =
62528
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    40
    if (s.startsWith("\\<")) s
71601
97ccf48c2f0c misc tuning based on hints by IntelliJ IDEA;
wenzelm
parents: 67493
diff changeset
    41
    else UTF8.bytes(s).iterator.map(print_byte).mkString
62528
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    42
66782
193c31b79a33 clarified signature;
wenzelm
parents: 65431
diff changeset
    43
  def print_string_bytes(str: String): String =
71601
97ccf48c2f0c misc tuning based on hints by IntelliJ IDEA;
wenzelm
parents: 67493
diff changeset
    44
    quote(UTF8.bytes(str).iterator.map(print_byte).mkString)
62528
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    45
66782
193c31b79a33 clarified signature;
wenzelm
parents: 65431
diff changeset
    46
  def print_string_symbols(str: String): String =
71601
97ccf48c2f0c misc tuning based on hints by IntelliJ IDEA;
wenzelm
parents: 67493
diff changeset
    47
    quote(Symbol.iterator(str).map(print_symbol).mkString)
62544
efa178abe023 manage the underlying ML process in Scala;
wenzelm
parents: 62528
diff changeset
    48
62709
fe3d50448833 more operations;
wenzelm
parents: 62638
diff changeset
    49
65431
4a3e6cda3b94 provide session base for "isabelle build" and "isabelle console" ML process;
wenzelm
parents: 63805
diff changeset
    50
  /* pair */
4a3e6cda3b94 provide session base for "isabelle build" and "isabelle console" ML process;
wenzelm
parents: 63805
diff changeset
    51
4a3e6cda3b94 provide session base for "isabelle build" and "isabelle console" ML process;
wenzelm
parents: 63805
diff changeset
    52
  def print_pair[A, B](f: A => String, g: B => String)(pair: (A, B)): String =
4a3e6cda3b94 provide session base for "isabelle build" and "isabelle console" ML process;
wenzelm
parents: 63805
diff changeset
    53
    "(" + f(pair._1) + ", " + g(pair._2) + ")"
4a3e6cda3b94 provide session base for "isabelle build" and "isabelle console" ML process;
wenzelm
parents: 63805
diff changeset
    54
4a3e6cda3b94 provide session base for "isabelle build" and "isabelle console" ML process;
wenzelm
parents: 63805
diff changeset
    55
62709
fe3d50448833 more operations;
wenzelm
parents: 62638
diff changeset
    56
  /* list */
fe3d50448833 more operations;
wenzelm
parents: 62638
diff changeset
    57
62544
efa178abe023 manage the underlying ML process in Scala;
wenzelm
parents: 62528
diff changeset
    58
  def print_list[A](f: A => String)(list: List[A]): String =
efa178abe023 manage the underlying ML process in Scala;
wenzelm
parents: 62528
diff changeset
    59
    "[" + commas(list.map(f)) + "]"
67493
c4e9e0c50487 treat sessions as entities with defining position;
wenzelm
parents: 66782
diff changeset
    60
c4e9e0c50487 treat sessions as entities with defining position;
wenzelm
parents: 66782
diff changeset
    61
c4e9e0c50487 treat sessions as entities with defining position;
wenzelm
parents: 66782
diff changeset
    62
  /* properties */
c4e9e0c50487 treat sessions as entities with defining position;
wenzelm
parents: 66782
diff changeset
    63
c4e9e0c50487 treat sessions as entities with defining position;
wenzelm
parents: 66782
diff changeset
    64
  def print_properties(props: Properties.T): String =
71601
97ccf48c2f0c misc tuning based on hints by IntelliJ IDEA;
wenzelm
parents: 67493
diff changeset
    65
    print_list(print_pair(print_string_bytes, print_string_bytes))(props)
62528
c8c532b22947 clarified ML syntax for strings concerning UTF8;
wenzelm
parents:
diff changeset
    66
}