src/Doc/System/Server.thy
author wenzelm
Thu, 22 Mar 2018 15:11:14 +0100
changeset 67921 1722384ffd4a
parent 67920 c3c74310154e
child 67922 9e668ae81f97
permissions -rw-r--r--
clarified signature: more uniform session_id;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
     1
(*:maxLineLen=78:*)
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
     2
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
     3
theory Server
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
     4
imports Base
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
     5
begin
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
     6
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
     7
chapter \<open>The Isabelle server\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
     8
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
     9
text \<open>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    10
  An Isabelle session requires at least two processes, which are both rather
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    11
  heavy: Isabelle/Scala for the system infrastructure and Isabelle/ML for the
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    12
  logic session (e.g.\ HOL). In principle, these processes can be invoked
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    13
  directly on the command-line, e.g.\ via @{tool java}, @{tool scala}, @{tool
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    14
  process}, @{tool console}, but this approach is inadequate for reactive
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    15
  applications that require quick responses from the prover.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    16
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    17
  In contrast, the Isabelle server exposes Isabelle/Scala as a
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    18
  ``terminate-stay-resident'' application that manages multiple logic
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    19
  \<^emph>\<open>sessions\<close> and concurrent tasks to use \<^emph>\<open>theories\<close>. This provides an
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    20
  analogous to @{ML Thy_Info.use_theories} in Isabelle/ML, but with full
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    21
  concurrency and Isabelle/PIDE markup.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    22
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    23
  The client/server arrangement via TCP sockets also opens possibilities for
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    24
  remote Isabelle services that are accessed by local applications, e.g.\ via
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    25
  an SSH tunnel.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    26
\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    27
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    28
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    29
section \<open>Command-line tools\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    30
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    31
subsection \<open>Server \label{sec:tool-server}\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    32
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    33
text \<open>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    34
  The @{tool_def server} tool manages resident server processes:
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    35
  @{verbatim [display]
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    36
\<open>Usage: isabelle server [OPTIONS]
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    37
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    38
  Options are:
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    39
    -L FILE      logging on FILE
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    40
    -c           console interaction with specified server
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    41
    -l           list servers (alternative operation)
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    42
    -n NAME      explicit server name (default: isabelle)
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    43
    -p PORT      explicit server port
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    44
    -s           assume existing server, no implicit startup
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    45
    -x           exit specified server (alternative operation)
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    46
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    47
  Manage resident Isabelle servers.\<close>}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    48
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    49
  The main operation of \<^verbatim>\<open>isabelle server\<close> is to ensure that a named server is
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    50
  running, either by finding an already running process (according to the
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    51
  central database file @{path "$ISABELLE_HOME_USER/servers.db"}) or by
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    52
  becoming itself a new server that accepts connections on a particular TCP
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    53
  socket. The server name and its address are printed as initial output line.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    54
  If another server instance is already running, the current
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    55
  \<^verbatim>\<open>isabelle server\<close> process will terminate; otherwise, it keeps running as a
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    56
  new server process until an explicit \<^verbatim>\<open>shutdown\<close> command is received.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    57
  Further details of the server socket protocol are explained in
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    58
  \secref{sec:server-protocol}.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    59
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    60
  Other server management operations are invoked via options \<^verbatim>\<open>-l\<close> and \<^verbatim>\<open>-x\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    61
  (see below).
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    62
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    63
  \<^medskip>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    64
  Option \<^verbatim>\<open>-n\<close> specifies an alternative server name: at most one process for
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    65
  each name may run, but each server instance supports multiple connections
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    66
  and logic sessions.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    67
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    68
  \<^medskip>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    69
  Option \<^verbatim>\<open>-p\<close> specifies an explicit TCP port for the server socket (which is
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    70
  always on \<^verbatim>\<open>localhost\<close>): the default is to let the operating system assign a
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    71
  free port number.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    72
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    73
  \<^medskip>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    74
  Option \<^verbatim>\<open>-s\<close> strictly assumes that the specified server process is already
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    75
  running, skipping the optional server startup phase.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    76
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    77
  \<^medskip>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    78
  Option \<^verbatim>\<open>-c\<close> connects the console in/out channels after the initial check
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
    79
  for a suitable server process. Also note that the @{tool client} tool
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
    80
  (\secref{sec:tool-client}) provides a command-line editor to interact with
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
    81
  the server.
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    82
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    83
  \<^medskip>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    84
  Option \<^verbatim>\<open>-L\<close> specifies a log file for exceptional output of internal server
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    85
  and session operations.
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
    86
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
    87
  \<^medskip>
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
    88
  Operation \<^verbatim>\<open>-l\<close> lists all active server processes with their connection
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
    89
  details.
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
    90
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
    91
  \<^medskip>
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
    92
  Operation \<^verbatim>\<open>-x\<close> exits the specified server process by sending it a
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
    93
  \<^verbatim>\<open>shutdown\<close> command.
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    94
\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    95
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    96
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    97
subsection \<open>Client \label{sec:tool-client}\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    98
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
    99
text \<open>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   100
  The @{tool_def client} tool provides console interaction for Isabelle
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   101
  servers:
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   102
  @{verbatim [display]
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   103
\<open>Usage: isabelle client [OPTIONS]
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   104
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   105
  Options are:
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   106
    -n NAME      explicit server name
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   107
    -p PORT      explicit server port
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   108
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   109
  Console interaction for Isabelle server (with line-editor).\<close>}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   110
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   111
  This is a wrapper to \<^verbatim>\<open>isabelle server -s -c\<close> for interactive
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   112
  experimentation, which uses @{setting ISABELLE_LINE_EDITOR} if available.
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   113
  The server name is sufficient for identification, as the client can
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   114
  determine the connection details from the local database of active servers.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   115
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   116
  \<^medskip>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   117
  Option \<^verbatim>\<open>-n\<close> specifies an explicit server name as in @{tool server}.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   118
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   119
  \<^medskip>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   120
  Option \<^verbatim>\<open>-p\<close> specifies an explicit server port as in @{tool server}.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   121
\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   122
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   123
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   124
subsection \<open>Examples\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   125
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   126
text \<open>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   127
  Ensure that a particular server instance is running in the background:
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   128
  @{verbatim [display] \<open>isabelle server -n test &\<close>}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   129
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   130
  The first line of output presents the connection details:\<^footnote>\<open>This information
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   131
  may be used in other TCP clients, without access to Isabelle/Scala and the
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   132
  underlying database of running servers.\<close>
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   133
  @{verbatim [display] \<open>server "test" = 127.0.0.1:4711 (password "XYZ")\<close>}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   134
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   135
  \<^medskip>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   136
  List available server processes:
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   137
  @{verbatim [display] \<open>isabelle server -l\<close>}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   138
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   139
  \<^medskip>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   140
  Connect the command-line client to the above test server:
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   141
  @{verbatim [display] \<open>isabelle client -n test\<close>}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   142
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   143
  Interaction now works on a line-by-line basis, with commands like \<^verbatim>\<open>help\<close> or
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   144
  \<^verbatim>\<open>echo\<close>. For example, some JSON values may be echoed like this:
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   145
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   146
  @{verbatim [display]
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   147
\<open>echo 42
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   148
echo [1, 2, 3]
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   149
echo {"a": "text", "b": true, "c": 42}\<close>}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   150
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   151
  Closing the connection (via CTRL-D) leaves the server running: it is
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   152
  possible to reconnect again, and have multiple connections at the same time.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   153
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   154
  \<^medskip>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   155
  Exit the named server on the command-line:
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   156
  @{verbatim [display] \<open>isabelle server -n test -x\<close>}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   157
\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   158
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   159
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   160
section \<open>Protocol messages \label{sec:server-protocol}\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   161
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   162
text \<open>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   163
  The Isabelle server listens on a regular TCP socket, using a line-oriented
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   164
  protocol of structured messages. Input \<^emph>\<open>commands\<close> and output \<^emph>\<open>results\<close>
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   165
  (via \<^verbatim>\<open>OK\<close> or \<^verbatim>\<open>ERROR\<close>) are strictly alternating on the toplevel, but
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   166
  commands may also return a \<^emph>\<open>task\<close> identifier to indicate an ongoing
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   167
  asynchronous process that is joined later (via \<^verbatim>\<open>FINISHED\<close> or \<^verbatim>\<open>FAILED\<close>).
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   168
  Asynchronous \<^verbatim>\<open>NOTE\<close> messages may occur at any time: they are independent of
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   169
  the main command-result protocol.
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   170
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   171
  For example, the synchronous \<^verbatim>\<open>echo\<close> command immediately returns its
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   172
  argument as \<^verbatim>\<open>OK\<close> result. In contrast, the asynchronous \<^verbatim>\<open>session_build\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   173
  command returns \<^verbatim>\<open>OK {"task":\<close>\<open>id\<close>\<^verbatim>\<open>}\<close> and continues in the background. It
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   174
  will eventually produce \<^verbatim>\<open>FINISHED {"task":\<close>\<open>id\<close>\<^verbatim>\<open>,\<close>\<open>\<dots>\<close>\<^verbatim>\<open>}\<close> or
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   175
  \<^verbatim>\<open>FAILED {"task":\<close>\<open>id\<close>\<^verbatim>\<open>,\<close>\<open>\<dots>\<close>\<^verbatim>\<open>}\<close> with the final result. Intermediately, it
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   176
  may emit asynchronous messages of the form \<^verbatim>\<open>NOTE {"task":\<close>\<open>id\<close>\<^verbatim>\<open>,\<close>\<open>\<dots>\<close>\<^verbatim>\<open>}\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   177
  to inform about its progress. Due to the explicit task identifier, the
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   178
  client can show these messages in the proper context, e.g.\ a GUI window for
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   179
  this particular session build job.
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   180
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   181
  \medskip Subsequently, the protocol message formats are described in further
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   182
  detail.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   183
\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   184
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   185
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   186
subsection \<open>Byte messages\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   187
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   188
text \<open>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   189
  The client-server connection is a raw byte-channel for bidirectional
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   190
  communication, but the Isabelle server always works with messages of a
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   191
  particular length. Messages are written as a single chunk that is flushed
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   192
  immediately.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   193
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   194
  Message boundaries are determined as follows:
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   195
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   196
    \<^item> A \<^emph>\<open>short message\<close> consists of a single line: it is a sequence of
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   197
    arbitrary bytes excluding CR (13) and LF (10), and terminated by CR-LF or
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   198
    just LF.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   199
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   200
    \<^item> A \<^emph>\<open>long message\<close> starts with a single that consists only of decimal
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   201
    digits: these are interpreted as length of the subsequent block of
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   202
    arbitrary bytes. A final line-terminator (as above) may be included here,
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   203
    but is not required.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   204
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   205
  Messages in JSON format (see below) always fit on a single line, due to
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   206
  escaping of newline characters within string literals. This is convenient
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   207
  for interactive experimentation, but it can impact performance for very long
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   208
  messages. If the message byte-length is given on the preceding line, the
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   209
  server can read the message more efficiently as a single block.
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   210
\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   211
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   212
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   213
subsection \<open>Text messages\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   214
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   215
text \<open>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   216
  Messages are read and written as byte streams (with byte lengths), but the
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   217
  content is always interpreted as plain text in terms of the UTF-8
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   218
  encoding.\<^footnote>\<open>See also the ``UTF-8 Everywhere Manifesto''
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   219
  \<^url>\<open>http://utf8everywhere.org\<close>.\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   220
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   221
  Note that line-endings and other formatting characters are invariant wrt.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   222
  UTF-8 representation of text: thus implementations are free to determine the
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   223
  overall message structure before or after applying the text encoding.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   224
\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   225
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   226
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   227
subsection \<open>Input and output messages \label{sec:input-output-messages}\<close>
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   228
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   229
text \<open>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   230
  Server input and output messages have a uniform format as follows:
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   231
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   232
    \<^item> \<open>name argument\<close> such that:
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   233
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   234
    \<^item> \<open>name\<close> is the longest prefix consisting of ASCII letters, digits,
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   235
    ``\<^verbatim>\<open>_\<close>'', ``\<^verbatim>\<open>.\<close>'',
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   236
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   237
    \<^item> the separator between \<open>name\<close> and \<open>argument\<close> is the longest possible
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   238
    sequence of ASCII blanks (it could be empty, e.g.\ when the argument
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   239
    starts with a quote or bracket),
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   240
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   241
    \<^item> \<open>argument\<close> is the rest of the message without line terminator.
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   242
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   243
  \<^medskip>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   244
  Input messages are sent from the client to the server. Here the \<open>name\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   245
  specifies a \<^emph>\<open>server command\<close>: the list of known commands may be
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   246
  retrieved via the \<^verbatim>\<open>help\<close> command.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   247
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   248
  \<^medskip>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   249
  Output messages are sent from the server to the client. Here the \<open>name\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   250
  specifies the \<^emph>\<open>server reply\<close>, which always has a specific meaning as
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   251
  follows:
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   252
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   253
    \<^item> synchronous results: \<^verbatim>\<open>OK\<close> or \<^verbatim>\<open>ERROR\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   254
    \<^item> asynchronous results: \<^verbatim>\<open>FINISHED\<close> or \<^verbatim>\<open>FAILED\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   255
    \<^item> intermediate notifications: \<^verbatim>\<open>NOTE\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   256
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   257
  \<^medskip>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   258
  The \<open>argument\<close> format is uniform for both input and output messages:
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   259
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   260
    \<^item> empty argument (Scala type \<^verbatim>\<open>Unit\<close>)
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   261
    \<^item> XML element in YXML notation (Scala type \<^verbatim>\<open>XML.Elem\<close>)
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   262
    \<^item> JSON value (Scala type \<^verbatim>\<open>JSON.T\<close>)
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   263
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   264
  JSON values may consist of objects (records), arrays (lists), strings,
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   265
  numbers, bools, null.\<^footnote>\<open>See also the official specification
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   266
  \<^url>\<open>https://www.json.org\<close> and unofficial explorations ``Parsing JSON is a
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   267
  Minefield'' \<^url>\<open>http://seriot.ch/parsing_json.php\<close>.\<close> Since JSON requires
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   268
  explicit quotes and backslash-escapes to represent arbitrary text, the YXML
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   269
  notation for XML trees (\secref{sec:yxml-vs-xml}) works better
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   270
  for large messages with a lot of PIDE markup.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   271
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   272
  Nonetheless, the most common commands use JSON by default: big chunks of
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   273
  text (theory sources etc.) are taken from the underlying file-system and
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   274
  results are pre-formatted for plain-text output, without PIDE markup
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   275
  information. This is a concession to simplicity: the server imitates the
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   276
  appearance of command-line tools on top of the Isabelle/PIDE infrastructure.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   277
\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   278
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   279
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   280
subsection \<open>Initial password exchange\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   281
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   282
text \<open>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   283
  Whenever a new client opens the server socket, the initial message needs to
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   284
  be its unique password. The server replies either with \<^verbatim>\<open>OK\<close> (and some
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   285
  information about the Isabelle version) or by silent disconnection of what
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   286
  is considered an illegal connection attempt. Note that @{tool client}
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   287
  already presents the correct password internally.
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   288
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   289
  Server passwords are created as Universally Unique Identifier (UUID) in
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   290
  Isabelle/Scala and stored in a per-user database, with restricted
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   291
  file-system access only for the current user. The Isabelle/Scala server
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   292
  implementation is careful to expose the password only on private output
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   293
  channels, and not on a process command-line (which is accessible to other
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   294
  users, e.g.\ via the \<^verbatim>\<open>ps\<close> command).
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   295
\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   296
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   297
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   298
subsection \<open>Synchronous commands\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   299
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   300
text \<open>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   301
  A \<^emph>\<open>synchronous command\<close> corresponds to regular function application in
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   302
  Isabelle/Scala, with single argument and result (regular or error). Both the
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   303
  argument and the result may consist of type \<^verbatim>\<open>Unit\<close>, \<^verbatim>\<open>XML.Elem\<close>, \<^verbatim>\<open>JSON.T\<close>.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   304
  An error result typically consists of a JSON object with error message and
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   305
  potentially further result fields (this resembles exceptions in Scala).
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   306
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   307
  These are the protocol exchanges for both cases of command execution:
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   308
  \begin{center}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   309
  \begin{tabular}{rl}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   310
  \<^bold>\<open>input:\<close> & \<open>command argument\<close> \\
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   311
  (a) regular \<^bold>\<open>output:\<close> & \<^verbatim>\<open>OK\<close> \<open>result\<close> \\
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   312
  (b) error \<^bold>\<open>output:\<close> & \<^verbatim>\<open>ERROR\<close> \<open>result\<close> \\
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   313
  \end{tabular}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   314
  \end{center}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   315
\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   316
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   317
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   318
subsection \<open>Asynchronous commands\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   319
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   320
text \<open>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   321
  An \<^emph>\<open>asynchronous command\<close> corresponds to an ongoing process that finishes
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   322
  or fails eventually, while emitting arbitrary notifications in between.
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   323
  Formally, it starts as synchronous command with immediate result \<^verbatim>\<open>OK\<close>
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   324
  giving the \<^verbatim>\<open>task\<close> identifier, or an immediate \<^verbatim>\<open>ERROR\<close> that indicates bad
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   325
  command syntax. For a running task, the termination is indicated later by
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   326
  \<^verbatim>\<open>FINISHED\<close> or \<^verbatim>\<open>FAILED\<close>, together with its ultimate result value.
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   327
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   328
  These are the protocol exchanges for various cases of command task
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   329
  execution:
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   330
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   331
  \begin{center}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   332
  \begin{tabular}{rl}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   333
  \<^bold>\<open>input:\<close> & \<open>command argument\<close> \\
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   334
  immediate \<^bold>\<open>output:\<close> & \<^verbatim>\<open>OK {"task":\<close>\<open>id\<close>\<^verbatim>\<open>}\<close> \\
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   335
  intermediate \<^bold>\<open>output:\<close> & \<^verbatim>\<open>NOTE {"task":\<close>\<open>id\<close>\<^verbatim>\<open>,\<close>\<open>\<dots>\<close>\<^verbatim>\<open>}\<close> \\
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   336
  (a) regular \<^bold>\<open>output:\<close> & \<^verbatim>\<open>FINISHED {"task":\<close>\<open>id\<close>\<^verbatim>\<open>,\<close>\<open>\<dots>\<close>\<^verbatim>\<open>}\<close> \\
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   337
  (b) error \<^bold>\<open>output:\<close> & \<^verbatim>\<open>FAILED {"task":\<close>\<open>id\<close>\<^verbatim>\<open>,\<close>\<open>\<dots>\<close>\<^verbatim>\<open>}\<close> \\[3ex]
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   338
  \<^bold>\<open>input:\<close> & \<open>command argument\<close> \\
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   339
  immediate \<^bold>\<open>output:\<close> & \<^verbatim>\<open>ERROR\<close>~\<open>\<dots>\<close> \\
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   340
  \end{tabular}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   341
  \end{center}
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   342
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   343
  All asynchronous messages are decorated with the task identifier that was
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   344
  revealed in the immediate (synchronous) result. Thus the client can
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   345
  invoke further asynchronous commands and still dispatch the resulting stream of
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   346
  asynchronous messages properly.
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
   347
67920
c3c74310154e clarified signature;
wenzelm
parents: 67919
diff changeset
   348
  The synchronous command \<^verbatim>\<open>cancel {"task":\<close>~\<open>id\<close>\<^verbatim>\<open>}\<close> tells the specified task
c3c74310154e clarified signature;
wenzelm
parents: 67919
diff changeset
   349
  to terminate prematurely: usually causing a \<^verbatim>\<open>FAILED\<close> result, but this is
c3c74310154e clarified signature;
wenzelm
parents: 67919
diff changeset
   350
  not guaranteed: the cancel event may come too late or the running process
c3c74310154e clarified signature;
wenzelm
parents: 67919
diff changeset
   351
  may just ignore it.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   352
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   353
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   354
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   355
section \<open>Types for JSON values \label{sec:json-types}\<close>
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   356
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   357
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   358
  In order to specify concrete JSON types for command arguments and result
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   359
  messages, the following type definition language shall be used:
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   360
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   361
  \<^rail>\<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   362
    @{syntax type_def}: @'type' @{syntax name} '=' @{syntax type}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   363
    ;
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   364
    @{syntax type}: @{syntax name} | @{syntax value} | 'any' | 'null' |
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   365
      'bool' | 'int' | 'long' | 'double' | 'string' | '[' @{syntax type} ']' |
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   366
      '{' (@{syntax field_type} ',' *) '}' |
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   367
      @{syntax type} '\<oplus>' @{syntax type} |
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   368
      @{syntax type} '|' @{syntax type} |
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   369
      '(' @{syntax type} ')'
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   370
    ;
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   371
    @{syntax field_type}: @{syntax name} ('?'?) ':' @{syntax type}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   372
  \<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   373
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   374
  This is a simplified variation of TypeScript
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   375
  interfaces.\<^footnote>\<open>\<^url>\<open>https://www.typescriptlang.org/docs/handbook/interfaces.html\<close>\<close>
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   376
  The meaning of these types is specified wrt. the Isabelle/Scala
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   377
  implementation as follows.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   378
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   379
  \<^item> A \<open>name\<close> refers to a type defined elsewhere. The environment of type
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   380
  definitions is given informally: put into proper foundational order, it
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   381
  needs to specify a strongly normalizing system of syntactic abbreviations;
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   382
  type definitions may not be recursive.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   383
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   384
  \<^item> A \<open>value\<close> in JSON notation represents the singleton type of the given
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   385
  item. For example, the string \<^verbatim>\<open>"error"\<close> can be used as type for a slot that
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   386
  is guaranteed to contain that constant.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   387
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   388
  \<^item> Type \<open>any\<close> is the super type of all other types: it is an untyped slot in
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   389
  the specification and corresponds to \<^verbatim>\<open>Any\<close> or \<^verbatim>\<open>JSON.T\<close> in Isabelle/Scala.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   390
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   391
  \<^item> Type \<open>null\<close> is the type of the improper value \<open>null\<close>; it corresponds to
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   392
  type \<^verbatim>\<open>Null\<close> in Scala and is normally not used in Isabelle/Scala.\<^footnote>\<open>See also
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   393
  ``Null References: The Billion Dollar Mistake'' by Tony Hoare
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   394
  \<^url>\<open>https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare\<close>.\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   395
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   396
  \<^item> Type \<open>bool\<close> is the type of the truth values \<^verbatim>\<open>true\<close> and \<^verbatim>\<open>false\<close>; it
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   397
  corresponds to \<^verbatim>\<open>Boolean\<close> in Scala.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   398
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   399
  \<^item> Types \<open>int\<close>, \<open>long\<close>, \<open>double\<close> are specific versions of the generic
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   400
  \<open>number\<close> type, corresponding to \<^verbatim>\<open>Int\<close>, \<^verbatim>\<open>Long\<close>, \<^verbatim>\<open>Double\<close> in Scala, but
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   401
  \<^verbatim>\<open>Long\<close> is limited to 53 bit precision.\<^footnote>\<open>Implementations of JSON typically
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   402
  standardize \<open>number\<close> to \<^verbatim>\<open>Double\<close>, which can absorb \<^verbatim>\<open>Int\<close> faithfully, but
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   403
  not all of \<^verbatim>\<open>Long\<close>.\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   404
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   405
  \<^item> Type \<open>string\<close> represents Unicode text; it corresponds to type \<^verbatim>\<open>String\<close> in
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   406
  Scala.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   407
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   408
  \<^item> Type \<open>[t]\<close> is the array (or list) type over \<open>t\<close>; it corresponds to
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   409
  \<^verbatim>\<open>List[t]\<close> in Scala. The list type is co-variant as usual (i.e.\ monotonic
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   410
  wrt. the subtype relation).
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   411
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   412
  \<^item> Object types describe the possible content of JSON records, with field
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   413
  names and types. A question mark after a field name means that it is
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   414
  optional. In Scala this could refer to an explicit type \<^verbatim>\<open>Option[t]\<close>, e.g.\
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   415
  \<open>{a: int, b?: string}\<close> corresponding to a Scala case class with arguments
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   416
  \<^verbatim>\<open>a: Int\<close>, \<^verbatim>\<open>b: Option[String]\<close>.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   417
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   418
  Alternatively, optional fields can have a default value. If nothing else is
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   419
  specified, a standard ``empty value'' is used for each type, i.e.\ \<^verbatim>\<open>0\<close> for
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   420
  the number types, \<^verbatim>\<open>false\<close> for \<open>bool\<close>, or the empty string, array, object
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   421
  etc.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   422
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   423
  Object types are \<^emph>\<open>permissive\<close> in the sense that only the specified field
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   424
  names need to conform to the given types, but unspecified fields may be
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   425
  present as well.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   426
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   427
  \<^item> The type expression \<open>t\<^sub>1 \<oplus> t\<^sub>2\<close> only works for two object types with
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   428
  disjoint field names: it is the concatenation of the respective @{syntax
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   429
  field_type} specifications taken together. For example: \<open>{task: string} \<oplus>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   430
  {ok: bool}\<close> is the equivalent to \<open>{task: string, ok: bool}\<close>.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   431
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   432
  \<^item> The type expression \<open>t\<^sub>1 | t\<^sub>2\<close> is the disjoint union of two types, either
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   433
  one of the two cases may occur.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   434
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   435
  \<^item> Parentheses \<open>(t)\<close> merely group type expressions syntactically.
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   436
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   437
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   438
  These types correspond to JSON values in an obvious manner, which is not
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   439
  further described here. For example, the JSON array \<^verbatim>\<open>[1, 2, 3]\<close> conforms to
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   440
  types \<open>[int]\<close>, \<open>[long]\<close>, \<open>[double]\<close>, \<open>[any]\<close>, \<open>any\<close>.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   441
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   442
  Note that JSON objects require field names to be quoted, but the type
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   443
  language omits quotes for clarity. Thus the object \<^verbatim>\<open>{"a": 42, "b": "xyz"}\<close>
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   444
  conforms to the type \<open>{a: int, b: string}\<close>, for example.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   445
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   446
  \<^medskip>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   447
  The absence of an argument or result is represented by the Scala type
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   448
  \<^verbatim>\<open>Unit\<close>: it is written as empty text in the message \<open>argument\<close>
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   449
  (\secref{sec:input-output-messages}). This is not part of the JSON language.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   450
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   451
  Server replies have name tags like \<^verbatim>\<open>OK\<close>, \<^verbatim>\<open>ERROR\<close>: these are used literally
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   452
  together with type specifications to indicate the particular name with the
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   453
  type of its argument, e.g.\ \<^verbatim>\<open>OK\<close>~\<open>[string]\<close> for a regular result that is a
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   454
  list (JSON array) of strings.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   455
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   456
  \<^bigskip>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   457
  Here are some common type definitions, for use in particular specifications
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   458
  of command arguments and results.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   459
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   460
  \<^item> \<^bold>\<open>type\<close>~\<open>position = {line?: int, offset?: int, end_offset?: int, file?:
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   461
  string, id?: long}\<close> describes a source position within Isabelle text. Only
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   462
  the \<open>line\<close> and \<open>file\<close> fields make immediate sense to external programs.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   463
  Detailed \<open>offset\<close> and \<open>end_offset\<close> positions are counted according to
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   464
  Isabelle symbols, see @{ML_type Symbol.symbol} in Isabelle/ML @{cite
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   465
  "isabelle-implementation"}. The position \<open>id\<close> belongs to the representation
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   466
  of command transactions in the Isabelle/PIDE protocol: it normally does not
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   467
  occur in externalized positions.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   468
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   469
  \<^item> \<^bold>\<open>type\<close>~\<open>message = {kind?: string, message: string, pos?: position}\<close> where
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   470
  the \<open>kind\<close> provides some hint about the role and importance of the message.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   471
  The main message kinds are \<^verbatim>\<open>writeln\<close> (for regular output), \<^verbatim>\<open>warning\<close>, and
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   472
  \<^verbatim>\<open>error\<close>. The table \<^verbatim>\<open>Markup.messages\<close> in Isabelle/Scala defines further
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   473
  message kinds for more specific applications.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   474
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   475
  \<^item> \<^bold>\<open>type\<close>~\<open>error_message = {kind:\<close>~\<^verbatim>\<open>"error"\<close>\<open>, message: string}\<close> refers to
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   476
  error messages in particular. These occur routinely with \<^verbatim>\<open>ERROR\<close> or
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   477
  \<^verbatim>\<open>FAILED\<close> replies, but also as initial command syntax errors (which are
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   478
  omitted in the command specifications below).
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   479
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   480
  \<^item> \<^bold>\<open>type\<close>~\<open>theory_progress = {kind:\<close>~\<^verbatim>\<open>"writeln"\<close>\<open>, message: string, theory:
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   481
  string, session: string}\<close> reports formal progress in loading theories (e.g.\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   482
  when building a session image). Apart from a regular output message, it also
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   483
  reveals the formal theory name (e.g.\ \<^verbatim>\<open>"HOL.Nat"\<close>) and session name (e.g.\
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   484
  \<^verbatim>\<open>"HOL"\<close>). Note that some rare theory names lack a proper session prefix,
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   485
  e.g. theory \<^verbatim>\<open>"Main"\<close> in session \<^verbatim>\<open>"HOL"\<close>.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   486
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   487
  \<^item> \<^bold>\<open>type\<close>~\<open>timing = {elapsed: double, cpu: double, gc: double}\<close> refers to
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   488
  common Isabelle timing information in seconds, usually with a precision of
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   489
  three digits after the point (whole milliseconds).
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   490
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   491
  \<^item> \<^bold>\<open>type\<close>~\<open>uuid = string\<close> refers to a Universally Unique Identifier (UUID)
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   492
  as plain text.\<^footnote>\<open>See \<^url>\<open>https://www.ietf.org/rfc/rfc4122.txt\<close> and
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   493
  \<^url>\<open>https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html\<close>.\<close> Such
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   494
  identifiers are created as private random numbers of the server and only
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   495
  revealed to the client that creates a certain resource (e.g.\ task or
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   496
  session). A client may disclose this information for use in a different
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   497
  client connection: this allows to share sessions between multiple
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   498
  connections.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   499
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   500
  Client commands need to provide syntactically wellformed UUIDs: this is
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   501
  trivial to achieve by using only identifiers that have been produced by the
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   502
  server beforehand.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   503
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   504
  \<^item> \<^bold>\<open>type\<close>~\<open>task = {task: uuid}\<close> identifies a newly created asynchronous task
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   505
  and thus allows the client to control it by the \<^verbatim>\<open>cancel\<close> command. The same
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   506
  task identification is included in all messages produced by this task.
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   507
67921
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   508
  \<^item> \<^bold>\<open>type\<close> \<open>session_id = {session_id: uuid}\<close> identifies a newly created PIDE
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   509
  session managed by the server. Sessions are independent of client
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   510
  connections and may be shared by different clients, as long as the internal
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   511
  session identifier is known.
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   512
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   513
  \<^item> \<^bold>\<open>type\<close> \<open>node_status = {ok: bool, total: int, unprocessed: int, running:
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   514
  int, warned: int, failed: int, finished: int, consolidated: bool}\<close>
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   515
  represents a formal theory node status of the PIDE document model. Fields
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   516
  \<open>total\<close>, \<open>unprocessed\<close>, \<open>running\<close>, \<open>warned\<close>, \<open>failed\<close>, \<open>finished\<close> account
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   517
  for individual commands within a theory node; \<open>ok\<close> is an abstraction for
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   518
  \<open>failed = 0\<close>. The \<open>consolidated\<close> flag indicates whether the outermost theory
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   519
  command structure has finished (or failed) and the final \<^theory_text>\<open>end\<close> command has
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   520
  been checked.
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   521
\<close>
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   522
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   523
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   524
section \<open>Server commands and results\<close>
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   525
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   526
text \<open>
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   527
  Here follows an overview of particular Isabelle server commands with their
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   528
  results, which are usually represented as JSON values with types according
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   529
  to \secref{sec:json-types}. The general format of input and output messages
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   530
  is described in \secref{sec:input-output-messages}. The relevant
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   531
  Isabelle/Scala source files are:
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   532
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   533
  \<^medskip>
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   534
  \begin{tabular}{l}
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   535
  \<^file>\<open>$ISABELLE_HOME/src/Pure/Tools/server_commands.scala\<close> \\
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   536
  \<^file>\<open>$ISABELLE_HOME/src/Pure/Tools/server.scala\<close> \\
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   537
  \<^file>\<open>$ISABELLE_HOME/src/Pure/General/json.scala\<close> \\
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   538
  \end{tabular}
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   539
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   540
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   541
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   542
subsection \<open>Command \<^verbatim>\<open>help\<close>\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   543
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   544
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   545
  \begin{tabular}{ll}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   546
  regular result: & \<^verbatim>\<open>OK\<close> \<open>[string]\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   547
  \end{tabular}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   548
  \<^medskip>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   549
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   550
  The \<^verbatim>\<open>help\<close> command has no argument and returns the list of server command
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   551
  names. This is occasionally useful for interactive experimentation (see also
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   552
  @{tool client} in \secref{sec:tool-client}).
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   553
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   554
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   555
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   556
subsection \<open>Command \<^verbatim>\<open>echo\<close>\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   557
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   558
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   559
  \begin{tabular}{ll}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   560
  argument: & \<open>any\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   561
  regular result: & \<^verbatim>\<open>OK\<close> \<open>any\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   562
  \end{tabular}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   563
  \<^medskip>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   564
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   565
  The \<^verbatim>\<open>echo\<close> command is the identity function: it returns its argument as
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   566
  regular result. This is occasionally useful for testing and interactive
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   567
  experimentation (see also @{tool client} in \secref{sec:tool-client}).
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   568
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   569
  The Scala type of \<^verbatim>\<open>echo\<close> is actually more general than given above:
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   570
  \<^verbatim>\<open>Unit\<close>, \<^verbatim>\<open>XML.Elem\<close>, \<^verbatim>\<open>JSON.T\<close> work uniformly. Note that \<^verbatim>\<open>XML.Elem\<close> might
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   571
  be difficult to type on the console in its YXML syntax
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   572
  (\secref{sec:yxml-vs-xml}).
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   573
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   574
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   575
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   576
subsection \<open>Command \<^verbatim>\<open>shutdown\<close>\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   577
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   578
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   579
  \begin{tabular}{ll}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   580
  regular result: & \<^verbatim>\<open>OK\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   581
  \end{tabular}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   582
  \<^medskip>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   583
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   584
  The \<^verbatim>\<open>shutdown\<close> command has no argument and result value. It forces a
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   585
  shutdown of the connected server process, stopping all open sessions and
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   586
  closing the server socket. This may disrupt pending commands on other
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   587
  connections!
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   588
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   589
  \<^medskip>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   590
  The command-line invocation \<^verbatim>\<open>isabelle server -x\<close> opens a server connection
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   591
  and issues a \<^verbatim>\<open>shutdown\<close> command (see also \secref{sec:tool-server}).
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   592
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   593
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   594
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   595
subsection \<open>Command \<^verbatim>\<open>cancel\<close>\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   596
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   597
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   598
  \begin{tabular}{ll}
67920
c3c74310154e clarified signature;
wenzelm
parents: 67919
diff changeset
   599
  argument: & \<open>task\<close> \\
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   600
  regular result: & \<^verbatim>\<open>OK\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   601
  \end{tabular}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   602
  \<^medskip>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   603
67921
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   604
  The command \<^verbatim>\<open>cancel {"task":\<close>~\<open>id\<close>\<^verbatim>\<open>}\<close> attempts to cancel the specified
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   605
  task.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   606
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   607
  Cancellation is merely a hint that the client prefers an ongoing process to
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   608
  be stopped. The command always succeeds formally, but it may get ignored by
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   609
  a task that is still running; it might also refer to a non-existing or
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   610
  no-longer existing task (without producing an error).
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   611
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   612
  Successful cancellation typically leads to an asynchronous failure of type
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   613
  \<^verbatim>\<open>FAILED {\<close>\<open>task: uuid, message:\<close>~\<^verbatim>\<open>"Interrupt"}\<close>. A different message is
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   614
  also possible, depending how the task handles the event.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   615
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   616
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   617
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   618
subsection \<open>Command \<^verbatim>\<open>session_build\<close> \label{sec:command-session-build}\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   619
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   620
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   621
  \begin{tabular}{lll}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   622
  argument: & \<open>session_build_args\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   623
  immediate result: & \<^verbatim>\<open>OK\<close> \<open>task\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   624
  notifications: & \<^verbatim>\<open>NOTE\<close> \<open>task \<oplus> (theory_progress | message)\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   625
  regular result: & \<^verbatim>\<open>FINISHED\<close> \<open>task \<oplus> session_build_results\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   626
  error result: & \<^verbatim>\<open>FAILED\<close> \<open>task \<oplus> error_message \<oplus> session_build_results\<close> \\[2ex]
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   627
  \end{tabular}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   628
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   629
  \begin{tabular}{lll}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   630
  \<^bold>\<open>type\<close> \<open>session_build_args =\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   631
  \quad\<open>{session: string,\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   632
  \quad~~\<open>preferences?: string,\<close> & \<^bold>\<open>default:\<close> server preferences \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   633
  \quad~~\<open>options?: [string],\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   634
  \quad~~\<open>dirs?: [string],\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   635
  \quad~~\<open>all_known?: bool,\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   636
  \quad~~\<open>system_mode?: bool,\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   637
  \quad~~\<open>verbose?: bool}\<close> \\[2ex]
67919
dd90faed43b2 clarified signature: do not expose somewhat accidental internal options;
wenzelm
parents: 67918
diff changeset
   638
  \end{tabular}
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   639
67919
dd90faed43b2 clarified signature: do not expose somewhat accidental internal options;
wenzelm
parents: 67918
diff changeset
   640
  \begin{tabular}{ll}
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   641
  \<^bold>\<open>type\<close> \<open>session_build_result =\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   642
  \quad\<open>{session: string,\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   643
  \quad~~\<open>ok: bool,\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   644
  \quad~~\<open>return_code: int,\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   645
  \quad~~\<open>timeout: bool,\<close> \\
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   646
  \quad~~\<open>timing: timing}\<close> \\[2ex]
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   647
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   648
  \<^bold>\<open>type\<close> \<open>session_build_results =\<close> \\
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   649
  \quad\<open>{ok: bool,\<close> \\
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   650
  \quad~~\<open>return_code: int,\<close> \\
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   651
  \quad~~\<open>sessions: [session_build_result]}\<close> \\
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   652
  \end{tabular}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   653
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   654
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   655
text \<open>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   656
  The \<^verbatim>\<open>session_build\<close> command prepares a session image for interactive use of
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   657
  theories. This is a limited version of command-line tool @{tool build}
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   658
  (\secref{sec:tool-build}), with specific options to request a formal context
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   659
  for an interactive PIDE session.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   660
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   661
  The build process is asynchronous, with notifications that inform about the
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   662
  progress of loaded theories. Some further informative messages are output as
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   663
  well.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   664
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   665
  Coordination of independent build processes is at the discretion of the
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   666
  client (or end-user), just as for @{tool build} and @{tool jedit}. There is
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   667
  no built-in coordination of conflicting builds with overlapping hierarchies
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   668
  of session images. In the worst case, a session image produced by one task
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   669
  may get overwritten by another task!
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   670
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   671
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   672
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   673
subsubsection \<open>Arguments\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   674
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   675
text \<open>
67919
dd90faed43b2 clarified signature: do not expose somewhat accidental internal options;
wenzelm
parents: 67918
diff changeset
   676
  The \<open>session\<close> field specifies the target session name. The build process
dd90faed43b2 clarified signature: do not expose somewhat accidental internal options;
wenzelm
parents: 67918
diff changeset
   677
  will produce all required ancestor images according to the overall session
dd90faed43b2 clarified signature: do not expose somewhat accidental internal options;
wenzelm
parents: 67918
diff changeset
   678
  graph.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   679
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   680
  \<^medskip>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   681
  The environment of Isabelle system options is determined from \<open>preferences\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   682
  that are augmented by \<open>options\<close>, which is a list individual updates of the
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   683
  form the \<open>name\<close>\<^verbatim>\<open>=\<close>\<open>value\<close> or \<open>name\<close> (the latter abbreviates
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   684
  \<open>name\<close>\<^verbatim>\<open>=true\<close>); see also command-line option \<^verbatim>\<open>-o\<close> for @{tool build}. The
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   685
  preferences are loaded from the file
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   686
  \<^path>\<open>$ISABELLE_HOME_USER/etc/preferences\<close> by default, but the client may
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   687
  provide alternative contents for it (as text, not a file-name). This could
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   688
  be relevant in situations where client and server run in different
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   689
  operating-system contexts.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   690
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   691
  \<^medskip>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   692
  The \<open>dirs\<close> field specifies additional directories for session ROOT and ROOTS
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   693
  files (\secref{sec:session-root}). This augments the name space of available
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   694
  sessions; see also option \<^verbatim>\<open>-d\<close> in @{tool build}.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   695
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   696
  \<^medskip>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   697
  The \<open>all_known\<close> field set to \<^verbatim>\<open>true\<close> includes all sessions from reachable
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   698
  ROOT entries into the name space of theories. This is relevant for proper
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   699
  session-qualified names, instead of referring to theory file names. The
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   700
  option enables the \<^verbatim>\<open>use_theories\<close> command
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   701
  (\secref{sec:command-use-theories}) to refer to arbitrary theories from
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   702
  other sessions, but considerable time is required to explore all accessible
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   703
  session directories and theory dependencies.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   704
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   705
  \<^medskip>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   706
  The \<open>system_mode\<close> field set to \<^verbatim>\<open>true\<close> stores resulting session images and
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   707
  log files in @{path "$ISABELLE_HOME/heaps"} instead of the default location
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   708
  @{setting ISABELLE_OUTPUT} (which is normally in @{setting
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   709
  ISABELLE_HOME_USER}). See also option \<^verbatim>\<open>-s\<close> in @{tool build}.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   710
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   711
  \<^medskip>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   712
  The \<open>verbose\<close> field set to \<^verbatim>\<open>true\<close> yields extra verbosity. The effect is
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   713
  similar to option \<^verbatim>\<open>-v\<close> in @{tool build}.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   714
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   715
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   716
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   717
subsubsection \<open>Intermediate output\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   718
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   719
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   720
  The asynchronous notifications of command \<^verbatim>\<open>session_build\<close> mainly serve as
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   721
  progress indicator: the output resembles that of the session build window of
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   722
  Isabelle/jEdit after startup @{cite "isabelle-jedit"}.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   723
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   724
  For the client it is usually sufficient to print the messages in plain text,
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   725
  but note that \<open>theory_progress\<close> also reveals formal \<open>theory\<close> and
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   726
  \<open>session\<close> names directly.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   727
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   728
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   729
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   730
subsubsection \<open>Results\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   731
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   732
text \<open>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   733
  The overall \<open>session_build_results\<close> contain both a summary and an entry
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   734
  \<open>session_build_result\<close> for each session in the build hierarchy. The result
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   735
  is always provided, independently of overall success (\<^verbatim>\<open>FINISHED\<close> task) or
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   736
  failure (\<^verbatim>\<open>FAILED\<close> task).
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   737
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   738
  The \<open>ok\<close> field tells abstractly, whether all required session builds came
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   739
  out as \<open>ok\<close>, i.e.\ with zero \<open>return_code\<close>. A non-zero \<open>return_code\<close>
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   740
  indicates an error according to usual POSIX conventions for process exit.
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   741
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   742
  The individual \<open>session_build_result\<close> entries provide extra fields:
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   743
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   744
  \<^item> \<open>timeout\<close> tells if the build process was aborted after running too long,
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   745
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   746
  \<^item> \<open>timing\<close> gives the overall process timing in the usual Isabelle format
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   747
  with elapsed, CPU, GC time.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   748
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   749
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   750
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   751
subsubsection \<open>Examples\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   752
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   753
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   754
  Build of a session image from the Isabelle distribution:
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   755
  @{verbatim [display] \<open>session_build {"session": "HOL-Word"}\<close>}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   756
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   757
  Build a session image from the Archive of Formal Proofs:
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   758
  @{verbatim [display] \<open>session_build {"session": "Coinductive", "dirs": ["$AFP_BASE/thys"]}\<close>}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   759
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   760
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   761
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   762
subsection \<open>Command \<^verbatim>\<open>session_start\<close> \label{sec:command-session-start}\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   763
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   764
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   765
  \begin{tabular}{lll}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   766
  argument: & \<open>session_build_args \<oplus> {print_mode?: [string]}\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   767
  immediate result: & \<^verbatim>\<open>OK\<close> \<open>task\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   768
  notifications: & \<^verbatim>\<open>NOTE\<close> \<open>task \<oplus> (theory_progress | message)\<close> \\
67921
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   769
  regular result: & \<^verbatim>\<open>FINISHED\<close> \<open>task \<oplus> session_id\<close> \\
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   770
  error result: & \<^verbatim>\<open>FAILED\<close> \<open>task \<oplus> error_message\<close> \\[2ex]
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   771
  \end{tabular}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   772
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   773
  \<^medskip>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   774
  The \<^verbatim>\<open>session_start\<close> command starts a new Isabelle/PIDE session with
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   775
  underlying Isabelle/ML process, based on a session image that it produces on
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   776
  demand using \<^verbatim>\<open>session_build\<close>. Thus it accepts all \<open>session_build_args\<close> and
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   777
  produces similar notifications, but the detailed \<open>session_build_results\<close> are
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   778
  omitted.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   779
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   780
  The session build and startup process is asynchronous: when the task is
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   781
  finished, the session remains active for commands, until a \<^verbatim>\<open>session_stop\<close>
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   782
  or \<^verbatim>\<open>shutdown\<close> command is sent to the server.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   783
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   784
  Sessions are independent of client connections: it is possible to start a
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   785
  session and later apply \<^verbatim>\<open>use_theories\<close> on different connections, as long as
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   786
  the internal session identifier is known: shared theory imports will be used
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   787
  only once (and persist until purged explicitly).
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   788
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   789
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   790
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   791
subsubsection \<open>Arguments\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   792
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   793
text \<open>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   794
  Most arguments are shared with \<^verbatim>\<open>session_build\<close>
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   795
  (\secref{sec:command-session-build}).
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   796
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   797
  \<^medskip>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   798
  The \<open>print_mode\<close> field adds identifiers of print modes to be made active for
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   799
  this session. For example, \<^verbatim>\<open>"print_mode": ["ASCII"]\<close> prefers ASCII
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   800
  replacement syntax over mathematical Isabelle symbols. See also option \<^verbatim>\<open>-m\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   801
  in @{tool process} (\secref{sec:tool-process}).
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   802
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   803
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   804
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   805
subsubsection \<open>Results\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   806
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   807
text \<open>
67921
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   808
  The \<open>session_id\<close> provides the internal identification of the session object
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   809
  within the sever process. It can remain active as long as the server is
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   810
  running, independently of the current client connection.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   811
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   812
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   813
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   814
subsection \<open>Examples\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   815
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   816
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   817
  Start a default Isabelle/HOL session:
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   818
  @{verbatim [display] \<open>session_start {"session": "HOL"}\<close>}
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   819
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   820
  Start a session from the Archive of Formal Proofs:
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   821
  @{verbatim [display] \<open>session_start {"session": "Coinductive", "dirs": ["$AFP_BASE/thys"]}\<close>}
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   822
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   823
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   824
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   825
subsection \<open>Command \<^verbatim>\<open>session_stop\<close>\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   826
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   827
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   828
  \begin{tabular}{ll}
67921
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   829
  argument: & \<open>session_id\<close> \\
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   830
  immediate result: & \<^verbatim>\<open>OK\<close> \<open>task\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   831
  regular result: & \<^verbatim>\<open>FINISHED\<close> \<open>task \<oplus> session_stop_result\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   832
  error result: & \<^verbatim>\<open>FAILED\<close> \<open>task \<oplus> error_message \<oplus> session_stop_result\<close> \\[2ex]
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   833
  \end{tabular}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   834
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   835
  \begin{tabular}{l}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   836
  \<^bold>\<open>type\<close> \<open>session_stop_result = {ok: bool, return_code: int}\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   837
  \end{tabular}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   838
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   839
  \<^medskip>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   840
  The \<^verbatim>\<open>session_stop\<close> command forces a shutdown of the identified PIDE
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   841
  session. This asynchronous tasks usually finishes quickly. Failure only
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   842
  happens in unusual situations, according to the return code of the
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   843
  underlying Isabelle/ML process.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   844
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   845
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   846
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   847
subsubsection \<open>Arguments\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   848
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   849
text \<open>
67921
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   850
  The \<open>session_id\<close> provides the UUID originally created by the server for this
1722384ffd4a clarified signature: more uniform session_id;
wenzelm
parents: 67920
diff changeset
   851
  session.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   852
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   853
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   854
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   855
subsubsection \<open>Results\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   856
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   857
text \<open>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   858
  The \<open>ok\<close> field tells abstractly, whether the Isabelle/ML process has
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   859
  terminated properly.
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   860
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   861
  The \<open>return_code\<close> field expresses this information according to usual POSIX
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   862
  conventions for process exit.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   863
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   864
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   865
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   866
subsection \<open>Command \<^verbatim>\<open>use_theories\<close> \label{sec:command-use-theories}\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   867
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   868
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   869
  \begin{tabular}{ll}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   870
  argument: & \<open>use_theories_arguments\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   871
  regular result: & \<^verbatim>\<open>OK\<close> \<open>use_theories_results\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   872
  \end{tabular}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   873
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   874
  \begin{tabular}{ll}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   875
  \<^bold>\<open>type\<close> \<open>theory_name = string | {name: string, pos: position}\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   876
  \end{tabular}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   877
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   878
  \begin{tabular}{ll}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   879
  \<^bold>\<open>type\<close> \<open>use_theories_arguments =\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   880
  \quad\<open>{session_id: uuid,\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   881
  \quad~~\<open>theories: [theory_name],\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   882
  \quad~~\<open>qualifier?: string,\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   883
  \quad~~\<open>master_dir?: string,\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   884
  \quad~~\<open>pretty_margin?: double\<close> & \<^bold>\<open>default:\<close> \<^verbatim>\<open>76\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   885
  \quad~~\<open>unicode_symbols?: bool}\<close> \\[2ex]
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   886
  \end{tabular}
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   887
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   888
  \begin{tabular}{ll}
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   889
  \<^bold>\<open>type\<close> \<open>node_result =\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   890
  \quad\<open>{node_name: string,\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   891
  \quad~~\<open>theory: string,\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   892
  \quad~~\<open>status: node_status,\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   893
  \quad~~\<open>messages: [message]}\<close> \\[2ex]
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   894
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   895
  \<^bold>\<open>type\<close> \<open>use_theories_results =\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   896
  \quad\<open>{ok: bool,\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   897
  \quad~~\<open>errors: [message],\<close> \\
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   898
  \quad~~\<open>nodes: [node_result]}\<close> \\[2ex]
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   899
  \end{tabular}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   900
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   901
  \<^medskip>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   902
  The \<^verbatim>\<open>use_theories\<close> command updates the identified session by adding the
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   903
  current version of theory files to it, while dependencies are resolved
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   904
  implicitly. The command succeeds eventually, when all theories have been
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   905
  \<^emph>\<open>consolidated\<close> in the sense the formal \<open>node_status\<close>
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   906
  (\secref{sec:json-types}): the outermost command structure has finished (or
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   907
  failed) and the final \<^theory_text>\<open>end\<close> command of each theory has been checked.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   908
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   909
  Already used theories persist in the session until purged explicitly. This
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   910
  also means that repeated invocations of \<^verbatim>\<open>use_theories\<close> are idempotent: it
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   911
  could make sense to do that with different values for \<open>pretty_margin\<close> or
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   912
  \<open>unicode_symbols\<close> to get different formatting for \<open>errors\<close> or \<open>messages\<close>.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   913
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   914
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   915
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   916
subsubsection \<open>Arguments\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   918
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   919
  The \<open>session_id\<close> is the identifier provided by the server, when the session
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   920
  was created (possibly on a different client connection).
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   921
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   922
  \<^medskip>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   923
  The \<open>theories\<close> field specifies theory names as in theory \<^theory_text>\<open>imports\<close> or in
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   924
  ROOT \<^bold>\<open>theories\<close>. An explicit source position for these theory name
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   925
  specifications may be given, which is occasionally useful for precise error
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   926
  locations.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   927
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   928
  \<^medskip>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   929
  The \<open>qualifier\<close> field provides an alternative session qualifier for theories
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   930
  that are not formally recognized as a member of a particular session. The
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   931
  default is \<^verbatim>\<open>Draft\<close> as in Isabelle/jEdit. There is rarely a need to change
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   932
  that, as theory nodes are already uniquely identified by their physical
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   933
  file-system location. This already allows reuse of theory base names with
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   934
  the same session qualifier --- as long as these theories are not used
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   935
  together (e.g.\ in \<^theory_text>\<open>imports\<close>).
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   936
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   937
  \<^medskip> The \<open>master_dir\<close> field explicit specifies the formal master directory of
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   938
  the imported theory. Normally this is determined implicitly from the parent
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   939
  directory of the theory file.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   940
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   941
  \<^medskip>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   942
  The \<open>pretty_margin\<close> field specifies the line width for pretty-printing. The
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   943
  default is suitable for classic console output. Formatting happens at the
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   944
  end of \<^verbatim>\<open>use_theories\<close>, when all prover messages are exported to the client.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   945
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   946
  \<^medskip>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   947
  The \<open>unicode_symbols\<close> field set to \<^verbatim>\<open>true\<close> renders message output for direct
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   948
  output on a Unicode capable channel, ideally with the Isabelle fonts as in
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   949
  Isabelle/jEdit. The default is to keep the symbolic representation of
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   950
  Isabelle text, e.g.\ \<^verbatim>\<open>\<forall>\<close> instead of its rendering as \<open>\<forall>\<close>. This means the
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   951
  client needs to perform its own rendering before presenting it to the
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   952
  end-user.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   953
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   954
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   955
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   956
subsubsection \<open>Results\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   957
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   958
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   959
  The \<open>ok\<close> field indicates overall success of processing the specified
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   960
  theories with all their dependencies.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   961
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   962
  When \<open>ok\<close> is \<^verbatim>\<open>false\<close>, the \<open>errors\<close> field lists all errors cumulatively
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   963
  (including imported theories). The messages contain position information for
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   964
  the original theory nodes.
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   965
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   966
  \<^medskip>
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   967
  The \<open>nodes\<close> field provides detailed information about each imported theory
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   968
  node. The individual fields are as follows:
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   969
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   970
  \<^item> \<open>node_name\<close>: the physical name for the theory node, based on its
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   971
  file-system location;
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   972
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   973
  \<^item> \<open>theory\<close>: the logical theory name, e.g.\ \<^verbatim>\<open>HOL-Library.AList\<close>;
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   974
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   975
  \<^item> \<open>status\<close>: the overall node status, e.g.\ see the visualization in the
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   976
  \<open>Theories\<close> panel of Isabelle/jEdit @{cite "isabelle-jedit"};
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   977
67918
7dc204623770 misc tuning and clarification;
wenzelm
parents: 67917
diff changeset
   978
  \<^item> \<open>messages\<close>: the main bulk of prover messages produced in this theory
67917
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   979
  (\<^verbatim>\<open>writeln\<close>, \<^verbatim>\<open>warning\<close>, \<^verbatim>\<open>error\<close>, etc.).
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   980
\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   981
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   982
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   983
subsubsection \<open>Examples\<close>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   984
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   985
text \<open>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   986
  Process some example theory from the Isabelle distribution, within the
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   987
  context of an already started session for Isabelle/HOL (see also
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   988
  \secref{sec:command-session-start}):
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   989
  @{verbatim [display] \<open>use_theories {"session_id": ..., "theories": ["~~/src/HOL/Isar_Examples/Drinker"]}\<close>}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   990
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   991
  \<^medskip>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   992
  Process some example theories that import other theories via
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   993
  session-qualified theory names:
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   994
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   995
  @{verbatim [display] \<open>session_start {"session": "HOL", "all_known": true}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   996
use_theories {"session_id": ..., "theories": ["~~/src/HOL/Unix/Unix"]}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   997
session_stop {"session_id": ...}\<close>}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   998
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
   999
  The option \<open>all_known\<close> has been used here to the full name space of
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
  1000
  session-qualified theory names accessible in this session. This is also the
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
  1001
  default in Isabelle/jEdit, although it requires significant startup time.
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
  1002
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
  1003
  \<^medskip>
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
  1004
  Process some example theories in the context of their (single) parent
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
  1005
  session:
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
  1006
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
  1007
  @{verbatim [display] \<open>session_start {"session": "HOL-Library"}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
  1008
use_theories {"session_id": ..., "theories": ["~~/src/HOL/Unix/Unix"]}
d13b2dd20f5e more documentation;
wenzelm
parents: 67904
diff changeset
  1009
session_stop {"session_id": ...}\<close>}
67904
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
  1010
\<close>
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
  1011
465f43a9f780 documentation for the Isabelle server;
wenzelm
parents:
diff changeset
  1012
end