lean2/doc/server.org
Leonardo de Moura b4775eb017 feat(frontends/lean/server): add EVAL command, closes #40
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2014-08-14 16:08:43 -07:00

210 lines
4.7 KiB
Org Mode

Lean can process input incrementally, and extract type information.
This feature is useful for implementing "intelligent" support for Lean
in editors such as Emacs. It provides a convenient way to access
descriptions of functions, overloaded symbols, and typing information.
We must use the option =--server= to enable this feature.
* Commands
Lean implements a simple set of commands for loading files, extracting
typing information, and "replacing" lines. The commands should be sent
to the standard input.
** Load file
#+BEGIN_SRC
LOAD [file-name]
#+END_SRC
This command loads the Lean file named =[file-name]=.
Lean will create a "snapshot" (aka backtracking point) after each
command. Lean uses the "snapshots" to process incremental updates efficiently.
** Visit file
#+BEGIN_SRC
VISIT [file-name]
#+END_SRC
Lean can keep information about multiple files. This command
sets =[file-name]= as the "current" file. The remaining commands
are all with respect to the current file. If =[file-name]= has not been
loaded yet, then this command will load it. Some of the remaining commands
apply "changes" to the current file. The =LOAD= command can be used to
discard all these changes, and enforce the content of the file stored
in file system.
** Replace line
#+BEGIN_SRC
REPLACE [line-number]
[new-line]
#+END_SRC
This command replaces the line =[line-number]= (in the current file) with =[new-line]=.
Lean uses the snapshots to process the request efficiently.
If =[line-number]= is greater than the total number of lines in the lean
buffer, then empty lines are introduced. The lines are indexed from 1.
** Insert line
#+BEGIN_SRC
INSERT [line-number]
[new-line]
#+END_SRC
This command inserts =[new-line]= (in the current file) before line =[line-number]=.
If =[line-number]= is greater than the total number of lines in the lean
buffer, then empty lines are introduced. The lines are indexed from 1.
** Remove line
#+BEGIN_SRC
REMOVE [line-number]
#+END_SRC
Remove line =[line-number]= (in the current file). The lines are indexed from 1.
If =[line-number]= is greater than the total number of lines in the lean
buffer, then the command is ignored.
** Extracting typing information
#+BEGIN_SRC
INFO [line-number]
#+END_SRC
This command extracts typing information associated with line
=[line-number]= (in the current file).
Lean produces a possible empty sequence of entries terminated with
#+BEGIN_SRC
-- ENDINFO
#+END_SRC
A type information entry is of the form
#+BEGIN_SRC
-- TYPE|[line-number]|[column-number]
[type]
-- ACK
#+END_SRC
Information for overloaded operators and symbols is of the form
#+BEGIN_SRC
-- OVERLOAD|[line-number]|[column-number]
[overload-1]
--
...
--
[overload-n]
-- ACK
#+END_SRC
Information for synthesized placeholders is of the form
#+BEGIN_SRC
-- SYNTH|[line-number]|[column-number]
[synthesized-term]
-- ACK
#+END_SRC
Here is an example of output produced by Lean
#+BEGIN_SRC
-- TYPE|15|38
num
-- ACK
-- TYPE|15|40
num → num → Prop
-- ACK
-- OVERLOAD|15|42
f
--
foo.f
-- ACK
-- TYPE|15|42
num → num
-- ACK
-- TYPE|15|44
num
-- ACK
-- ENDINFO
#+END_SRC
** Check line
As described above, several commands can be used to apply
modifications to opened/visited files. These modification reflect
modifications performed by the text editor. The command =CHECK= can be
used to double check whether the text editor and Lean have the "same
view" of the current file + modifications.
The following commands returns =-- OK= if the line =[line-number]= in
the current file is =[line]=. It returns =-- MISMATCH line out of
range=, if =[line-number]= is too big, and =-- MISMATCH expected
[lean-line]= when there is a mismatch, and Lean expects
=[line-number]= to be =[lean-line]=.
#+BEGIN_SRC
-- CHECK [line-number]
[line]
#+END_SRC
** Set configuration option
The command
#+BEGIN_SRC
-- SET
[option-name] [value]
#+END_SRC
sets a Lean options, =[option-name]= must be a valid Lean option.
Any option that can be set using the command =set_option= in a '.lean'
file is supported.
This command produces the output
#+BEGIN_SRC
-- BEGINSET
[error]?
-- ENDSET
#+END_SRC
where the line =[error]?= is printed if there are errors parsing the
=SET= command (e.g., invalid option name).
Here is an example that forces the Lean pretty printer to display
implicit arguments.
#+BEGIN_SRC
-- SET
pp.implicit true
#+END_SRC
** Eval
The following command evaluates a Lean command. It has the effect of
evaluating a command in the end of the current file
#+BEGIN_SRC
-- EVAL
[command]
#+END_SRC
This command produces the output
#+BEGIN_SRC
-- BEGINEVAL
[error]/[output]
-- ENDEVAL
#+END_SRC
Here is an example that executes the =check= command to obtain the
type of =Prop=.
#+BEGIN_SRC
-- EVAL
check Prop
#+END_SRC