<expr> ::= <name> | <func> | <appl>
<name> is an identifier (sorry, no BNF)
<func> ::= λ<name>.<body>
<body> ::= <expr>
<appl> ::= (<func> <expr>)λx.xx => xfunction(x) { return x; }lambda x: x\x -> xfun x -> x(fn [x] x)(lambda (x) x)((λx.λy.λz.x (y z)) a) b
(λy.λz.a (y z)) b
λz.a (b z)λx.x
λf.λa.(f a)
λx.λy.x
λf.λx.λy.((f y) x)identity
apply
const
flip
fst := λx.λy.x
snd: = λx.λy.y
pair := λx.λy.λf.((f x) y)true := λx.λy.x
false := λx.λy.y
if := λx.λy.λf.((f x) y)zero := λf.λx.x
succ := λn.λf.λx.(f ((n f) x))
one := λf.λx.(f x)
two := λf.λx.(f (f x))plus :=
λm.λn.λf.λx.(m (f ((n f) x)))
mult := λm.λn.λf.(m (n f))
exp := λm.λn.(n m)λfλgλx.(f (g x))