Function: labels
labels is a macro defined in cl.el.gz.
This macro is obsolete since 24.3; use cl-labels instead.
Signature
(labels BINDINGS &rest BODY)
Documentation
Make temporary function bindings.
Like cl-labels except that the lexical scoping is handled via lexical-let
rather than relying on lexical-binding.
Probably introduced at or before Emacs version 24.3.
Source Code
;; Defined in /usr/src/emacs/lisp/obsolete/cl.el.gz
(defmacro labels (bindings &rest body)
"Make temporary function bindings.
Like `cl-labels' except that the lexical scoping is handled via `lexical-let'
rather than relying on `lexical-binding'."
(declare (indent 1) (debug cl-flet) (obsolete cl-labels "24.3"))
(let ((vars nil) (sets nil) (newenv macroexpand-all-environment))
(dolist (binding bindings)
;; It's important that (not (eq (symbol-name var1) (symbol-name var2)))
;; because these var's *names* get added to the macro-environment.
(let ((var (make-symbol (format "--cl-%s--" (car binding)))))
(push var vars)
(push `(cl-function (lambda . ,(cdr binding))) sets)
(push var sets)
(push (cons (car binding)
(lambda (&rest cl-labels-args)
(if (eq (car cl-labels-args) cl--labels-magic)
(list cl--labels-magic var)
(cl-list* 'funcall var cl-labels-args))))
newenv)))
;; `lexical-let' adds `cl--function-convert' (which calls
;; `cl--labels-convert') as a macroexpander for `function'.
(macroexpand-all `(lexical-let ,vars (setq ,@sets) ,@body) newenv)))