Next: Macro Bindings, Previous: Dynamic Bindings, Up: Variable Bindings
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 acl-defun
form. The function name is defined accordingly but only within the body of thecl-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 bycl-defun
; also, the function body is enclosed in an implicit block as if bycl-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 likecl-flet
, except that the function bindings can be recursive. The scoping is lexical, but you can only capture functions in closures iflexical-binding
ist
. See Closures, and 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 ofcl-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
orfunction
to be passed on to, say,mapcar
.Note that the cl.el version of this macro behaves slightly differently. See Obsolete Macros.