Next: , Previous: Dynamic Bindings, Up: Variable 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. 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.

— 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. 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 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.