cl: Function Bindings
4.3.2 Function Bindings
-----------------------
These forms make ‘let’-like bindings to functions instead of variables.
-- Macro: cl-flet (bindings...) forms...
This form establishes ‘let’-style bindings on the function cells of
symbols rather than on the value cells. Each BINDING must be a
list of the form ‘(NAME ARGLIST FORMS...)’, which defines a
function exactly as if it were a ‘cl-defun’ form. The function
NAME is defined accordingly but only within the body of the
‘cl-flet’, hiding any external definition if applicable.
The bindings are lexical in scope. This means that all references
to the named functions must appear physically within the body of
the ‘cl-flet’ form.
Functions defined by ‘cl-flet’ may use the full Common Lisp
argument notation supported by ‘cl-defun’; also, the function body
is enclosed in an implicit block as if by ‘cl-defun’.
Program Structure.
Note that the ‘cl.el’ version of this macro behaves slightly
differently. In particular, its binding is dynamic rather than
lexical. Obsolete Macros.
-- Macro: cl-labels (bindings...) forms...
The ‘cl-labels’ form is like ‘cl-flet’, except that the function
bindings can be recursive. The scoping is lexical, but you can
only capture functions in closures if ‘lexical-binding’ is ‘t’.
(elisp)Closures, and (elisp)Using Lexical Binding.
Lexical scoping means that all references to the named functions
must appear physically within the body of the ‘cl-labels’ form.
References may appear both in the body FORMS of ‘cl-labels’ itself,
and in the bodies of the functions themselves. Thus, ‘cl-labels’
can define local recursive functions, or mutually-recursive sets of
functions.
A “reference” to a function name is either a call to that function,
or a use of its name quoted by ‘quote’ or ‘function’ to be passed
on to, say, ‘mapcar’.
Note that the ‘cl.el’ version of this macro behaves slightly
differently. Obsolete Macros.