Add macro pcase-lambda
Fixes: debbugs:19814 * emacs-lisp/lisp-mode.el (el-kws-re): Include `pcase-lambda'. * emacs-lisp/macroexp.el (macroexp-parse-body): New function. * emacs-lisp/pcase.el (pcase-lambda): New Macro.
This commit is contained in:
parent
fd6f7d1449
commit
751adc4b96
4 changed files with 39 additions and 1 deletions
|
@ -204,7 +204,7 @@
|
|||
"defface"))
|
||||
(el-tdefs '("defgroup" "deftheme"))
|
||||
(el-kw '("while-no-input" "letrec" "pcase" "pcase-exhaustive"
|
||||
"pcase-let" "pcase-let*" "save-restriction"
|
||||
"pcase-lambda" "pcase-let" "pcase-let*" "save-restriction"
|
||||
"save-excursion" "save-selected-window"
|
||||
;; "eval-after-load" "eval-next-after-load"
|
||||
"save-window-excursion" "save-current-buffer"
|
||||
|
|
|
@ -297,6 +297,16 @@ definitions to shadow the loaded ones for use in file byte-compilation."
|
|||
|
||||
;;; Handy functions to use in macros.
|
||||
|
||||
(defun macroexp-parse-body (exps)
|
||||
"Parse EXPS into ((DOC DECLARE-FORM INTERACTIVE-FORM) . BODY)."
|
||||
`((,(and (stringp (car exps))
|
||||
(pop exps))
|
||||
,(and (eq (car-safe (car exps)) 'declare)
|
||||
(pop exps))
|
||||
,(and (eq (car-safe (car exps)) 'interactive)
|
||||
(pop exps)))
|
||||
,@exps))
|
||||
|
||||
(defun macroexp-progn (exps)
|
||||
"Return an expression equivalent to `(progn ,@EXPS)."
|
||||
(if (cdr exps) `(progn ,@exps) (car exps)))
|
||||
|
|
|
@ -164,6 +164,26 @@ like `(,a . ,(pred (< a))) or, with more checks:
|
|||
;; FIXME: Could we add the FILE:LINE data in the error message?
|
||||
exp (append cases `((,x (error "No clause matching `%S'" ,x)))))))
|
||||
|
||||
;;;###autoload
|
||||
(defmacro pcase-lambda (lambda-list &rest body)
|
||||
"Like `lambda' but allow each argument to be a pattern.
|
||||
`&rest' argument is supported."
|
||||
(declare (doc-string 2) (indent defun)
|
||||
(debug ((&rest pcase-UPAT &optional ["&rest" pcase-UPAT]) body)))
|
||||
(let ((args (make-symbol "args"))
|
||||
(pats (mapcar (lambda (u)
|
||||
(unless (eq u '&rest)
|
||||
(if (eq (car-safe u) '\`) (cadr u) (list '\, u))))
|
||||
lambda-list))
|
||||
(body (macroexp-parse-body body)))
|
||||
;; Handle &rest
|
||||
(when (eq nil (car (last pats 2)))
|
||||
(setq pats (append (butlast pats 2) (car (last pats)))))
|
||||
`(lambda (&rest ,args)
|
||||
,@(remq nil (car body))
|
||||
(pcase ,args
|
||||
(,(list '\` pats) . ,(cdr body))))))
|
||||
|
||||
(defun pcase--let* (bindings body)
|
||||
(cond
|
||||
((null bindings) (macroexp-progn body))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue