lean2/doc/server.org
Leonardo de Moura be8ee8b3c0 feat(frontends/lean): add information about synthesized placeholders, closes #39
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2014-08-14 10:37:24 -07:00

3.7 KiB

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

LOAD [file-name]

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

VISIT [file-name]

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

REPLACE [line-number]
[new-line]

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

INSERT [line-number]
[new-line]

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

REMOVE [line-number]

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

INFO [line-number]

This command extracts typing information associated with line [line-number] (in the current file). Lean produces a possible empty sequence of entries terminated with

-- ENDINFO

A type information entry is of the form

-- TYPE|[line-number]|[column-number]
[type]
-- ACK

Information for overloaded operators and symbols is of the form

-- OVERLOAD|[line-number]|[column-number]
[overload-1]
--
...
--
[overload-n]
-- ACK

Information for synthesized placeholders is of the form

-- SYNTH|[line-number]|[column-number]
[synthesized-term]
-- ACK

Here is an example of output produced by Lean

-- 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

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].

-- CHECK [line-number]
[line]