Function: pcase-lambda

pcase-lambda is an autoloaded macro defined in pcase.el.gz.

Signature

(pcase-lambda LAMBDA-LIST &rest BODY)

Documentation

Like lambda but allow each argument to be a pattern.

I.e. accepts the usual &optional and &rest keywords, but every formal argument can be any pattern destructed by pcase-let (a mere variable name being but a special case of it).

Each argument should match its respective pattern in the parameter list (i.e. be of a compatible structure); a mismatch may signal an error or may go undetected, binding arguments to arbitrary values, such as nil.

View in manual

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/pcase.el.gz
;;;###autoload
(defmacro pcase-lambda (lambda-list &rest body)
  "Like `lambda' but allow each argument to be a pattern.
I.e. accepts the usual &optional and &rest keywords, but every formal
argument can be any pattern destructed by `pcase-let' (a mere variable
name being but a special case of it).

Each argument should match its respective pattern in the parameter
list (i.e. be of a compatible structure); a mismatch may signal an error
or may go undetected, binding arguments to arbitrary values, such as
nil."
  (declare (doc-string 2) (indent defun)
           (debug (&define (&rest pcase-PAT) lambda-doc def-body)))
  (let* ((bindings ())
         (parsed-body (macroexp-parse-body body))
         (args (mapcar (lambda (pat)
                         (if (symbolp pat)
                             ;; Simple vars and &rest/&optional are just passed
                             ;; through unchanged.
                             pat
                           (let ((arg (make-symbol
                                       (format "arg%s" (length bindings)))))
                             (push `(,pat ,arg) bindings)
                             arg)))
                       lambda-list)))
    `(lambda ,args ,@(car parsed-body)
       (pcase-let* ,(nreverse bindings) ,@(cdr parsed-body)))))