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