compile/flet
Syntax: (flet [[NAME FORMALS BODY ...] ...] FORM ...)
Behaviour: Binds local functions for the extent of a body. Each declaration
becomes a let binding whose value is an anonymous lambda:
(flet [[double [x] (* x 2)]
[inc [x] (+ x 1)]]
(double (inc 20)))
is equivalent to:
(let [[double (lambda [x] (* x 2))]
[inc (lambda [x] (+ x 1))]]
(double (inc 20)))
Because let initializers are evaluated in the enclosing scope, a binding
shadows an outer function of the same name but does not see its siblings in
the same flet, so the bound functions cannot be mutually recursive. Reach
for labels when the functions must call one another.