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.

View in manual

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)))