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’.  See
      Program Structure.
 
      Note that the ‘cl.el’ version of this macro behaves slightly
      differently.  In particular, its binding is dynamic rather than
      lexical.  SeeObsolete 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(elisp)Closures, and See(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.  SeeObsolete Macros.