-
Notifications
You must be signed in to change notification settings - Fork 4
syntax guide
Lambda Calculus syntax consists of terms, which can be:
- variables
- function expressions ( abstractions )
- function calls ( applications )
There are also:
- parentheses ( for overriding precedence )
- whitespace ( separates names and may continue lines, but otherwise ignored )
Lambda Calculus compiler syntax consists of:
- definitions
- comments
Comments start with a hash # and continue until the end of the current line.
User comments should have whitespace immediately following the hash; comments immediately followed by non-whitespace text are reserved for future use ( compiler pragmas, eg. #define ).
Comments are currently completely ignored for all purposes, specifically including ending line continuations by indentation.
The one exception is #debug, which toggles strict mode for syntax highlighting, but does not affect compilation in any way.
Definitions are of the form $NAME = $TERM.
Definitions can be overwritten. The last earlier definition will be used when referenced.
A definition starts with non-whitespace, non-comment text at the left margin and continues until ( not including ) the next non-whitespace, non-comment text at the left margin, or until the end of the source file.
Whitespace satisfies JavaScript /\s+/.
Whitespace can be used anywhere but within identifiers.
If a line starts with whitespace it is considered to continue the previous definition.
Empty lines are allowed and do not break line continuations.
Identifiers are names.
They must start with a letter or an underscore, and may have any number of letters, digits, underscores ( _ ), dashes ( - ) or primes ( ' ) after that.
In v1.0.5 or later, they may also end with a question mark ( ? ), which is then part of the identifier.
The compiler is case-sensitive and case-preserving.
Names may be used as variables or as binders in a lambda abstraction.
Names that start with an underscore are not actually bound to values; evaluating them is an error, but assigning a value to them is not. For performance reaons, it is recommended not to bind unused arguments of functions to defined names; bind them to any name starting with _ so the binding will be skipped.
Numbers are immediate numeric values. They will be compiled according to the numEncoding in effect and inserted as abstractions.
Variables are of the form $NAME.
Functions are of the form \ $NAME . $TERM. The backslash \ is displayed as a lambda λ.
Functions have exactly one argument, which is an identifier, but the compiler syntax allows ( but does not mandate ) contracting \ fst . \ snd . term to \ fst snd . term. ( This defines a curried function. )
Identifier names starting with an underscore will capture, but not actually bind, an applied value.
Functions have exactly one body, which may be a value, abstraction, or application.
Function bodies extend as far right as syntactically possible.
Applications are of the form $TERM $TERM.
The compiler syntax, with parentheses (), allows empty applications; evaluating them is an error, but applying them to a term is not.
A single term may be considered a trivial application.
Terms may be a variable, abstraction, or application.
Application is left associative.