Function: rx--pcase-expand
rx--pcase-expand is an autoloaded and byte-compiled function defined
in rx.el.gz.
Signature
(rx--pcase-expand REGEXPS)
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/rx.el.gz
;; Autoloaded because it's referred to by the pcase rx macro above,
;; whose body ends up in loaddefs.el.
;;;###autoload
(defun rx--pcase-expand (regexps)
(let* ((rx--pcase-vars nil)
(regexp (rx--to-expr (rx--pcase-transform (cons 'seq regexps)))))
`(and (pred stringp)
,(pcase (length rx--pcase-vars)
(0
;; No variables bound: a single predicate suffices.
`(pred (string-match ,regexp)))
(1
;; Create a match value that on a successful regexp match
;; is the submatch value, 0 on failure. We can't use nil
;; for failure because it is a valid submatch value.
`(app (lambda (s)
(if (string-match ,regexp s)
(match-string 1 s)
0))
(and ,(car rx--pcase-vars) (pred (not numberp)))))
(nvars
;; Pack the submatches into a dotted list which is then
;; immediately destructured into individual variables again.
;; This is of course slightly inefficient.
;; A dotted list is used to reduce the number of conses
;; to create and take apart.
`(app (lambda (s)
(and (string-match ,regexp s)
,(rx--reduce-right
(lambda (a b) `(cons ,a ,b))
(mapcar (lambda (i) `(match-string ,i s))
(number-sequence 1 nvars)))))
,(list '\`
(rx--reduce-right
#'cons
(mapcar (lambda (name) (list '\, name))
(reverse rx--pcase-vars))))))))))