Function: pcase-setq
pcase-setq is an autoloaded macro defined in pcase.el.gz.
Signature
(pcase-setq PATTERNS VALUE PATTERN VALUES ...)
Documentation
Assign values to variables by destructuring with pcase.
PATTERNS are normal pcase patterns, and VALUES are expression.
Evaluation happens sequentially as in setq (not in parallel).
An example: (pcase-setq ((,a) [(,b)]) ((1) [(2)]))
VAL is presumed to match PAT. 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'.
PATTERNS are normal `pcase' patterns, and VALUES are expression.
Evaluation happens sequentially as in `setq' (not in parallel).
An example: (pcase-setq `((,a) [(,b)]) '((1) [(2)]))
VAL is presumed to match PAT. Failure to match may signal an error or go
undetected, binding variables to arbitrary values, such as nil.
\(fn PATTERNS VALUE PATTERN VALUES ...)"
(declare (debug (&rest [pcase-PAT form])))
(cond
(args
(let ((arg-length (length args)))
(unless (= 0 (mod arg-length 2))
(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))))))