Function: pcase-setq
pcase-setq is an autoloaded macro defined in pcase.el.gz.
Signature
(pcase-setq PATTERN VALUE PATTERN VALUE ...)
Documentation
Assign values to variables by destructuring with pcase.
Each PATTERN is a normal pcase pattern, and each VALUE an expression.
Evaluation happens sequentially as in setq (not in parallel).
An example: (pcase-setq `((,a) [(,b)]) '((1) [(2)]))
Each VALUE is presumed to match its PATTERN. Failure to match may signal an error or go undetected, binding variables to arbitrary values, such as nil.
Probably introduced at or before Emacs version 28.1.
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/pcase.el.gz
;;;###autoload
(defmacro pcase-setq (pat val &rest args)
"Assign values to variables by destructuring with `pcase'.
Each PATTERN is a normal `pcase' pattern, and each VALUE an expression.
Evaluation happens sequentially as in `setq' (not in parallel).
An example: (pcase-setq \\=`((,a) [(,b)]) \\='((1) [(2)]))
Each VALUE is presumed to match its PATTERN. Failure to match may
signal an error or go undetected, binding variables to arbitrary values,
such as nil.
\(fn PATTERN VALUE PATTERN VALUE ...)"
(declare (debug (&rest [pcase-PAT form])))
(cond
(args
(let ((arg-length (length args)))
(unless (evenp arg-length)
(signal 'wrong-number-of-arguments
(list 'pcase-setq (+ 2 arg-length)))))
(let ((result))
(while args
(push `(pcase-setq ,(pop args) ,(pop args))
result))
`(progn
(pcase-setq ,pat ,val)
,@(nreverse result))))
((pcase--trivial-upat-p pat)
`(setq ,pat ,val))
(t
(pcase-compile-patterns
val
`((,pat
. ,(lambda (varvals &rest _)
`(setq ,@(mapcan (lambda (varval)
(let ((var (car varval))
(val (cadr varval)))
(list var val)))
varvals))))
(pcase--dontcare . ignore))))))