Next: Macro Bindings, Previous: Dynamic Bindings, Up: Variable Bindings [Contents][Index]
These forms make let
-like bindings to functions instead
of variables.
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
.
See Program Structure.
Note that the cl.el version of this macro behaves slightly differently. In particular, its binding is dynamic rather than lexical. See Obsolete Macros.
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
.
See Closures in GNU Emacs Lisp Reference Manual, and
Using Lexical Binding in GNU Emacs Lisp Reference Manual.
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. See Obsolete Macros.
Next: Macro Bindings, Previous: Dynamic Bindings, Up: Variable Bindings [Contents][Index]