Syntax

<Exp> ::= <identifier> |  
( <Exp> ) |  
<Exp> <Exp> |  --application
λ<identifier>.<Exp>    --abstraction
-- Syntax of the λ-calculus --

Below is the syntax of a small programming language based on lambda calculus. It is more convenient to use but no more powerful, in terms of what it can compute, than the pure lambda calculus above.

program ::= exp

exp ::= ident | numeral | 'letter' | () | true | false | nil |
        ( exp ) | unopr exp | exp binopr exp |
        if exp then exp else exp |
        lambda param . exp  |  exp exp |
        let [rec] decs in exp

decs  ::= dec , decs | dec
dec   ::= ident = exp

param ::= () | ident

unopr ::= hd | tl | null | not | -
binopr ::= and | or | = | <> | < | <= | > | >= | + | - | * | / | ::

priorities: ::               1 cons list (right associative)
            or               2
            and              3
            = <> < <= > >=   4 scalars only
            + -              5 (binary -)
            * /              6
            application      7 {left associative, f x y = (f(x))(y)}
            - hd tl null not 8 (unary -)

NB. The trivial value, ( ), is only present for syntactic compatibility with a strict (non-lazy) version of the language. There are interactive examples.