aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2015-03-19 13:46:36 -0400
committerStefan Monnier2015-03-19 13:46:36 -0400
commit8aa13d07fe72b8a00ded10602f5c5ce773181b40 (patch)
treee379696ae1b93ee351e18ba102c12c7ce92bcf2e
parent29f7f98b7c3755f8f9e9dcef60bd460794cf2104 (diff)
downloademacs-8aa13d07fe72b8a00ded10602f5c5ce773181b40.tar.gz
emacs-8aa13d07fe72b8a00ded10602f5c5ce773181b40.zip
* lisp/emacs-lisp/pcase.el (pcase-lambda): Rewrite.
-rw-r--r--lisp/ChangeLog2
-rw-r--r--lisp/emacs-lisp/pcase.el35
2 files changed, 21 insertions, 16 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 74a0988c98f..a2500e3fadc 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,5 +1,7 @@
12015-03-19 Stefan Monnier <monnier@iro.umontreal.ca> 12015-03-19 Stefan Monnier <monnier@iro.umontreal.ca>
2 2
3 * emacs-lisp/pcase.el (pcase-lambda): Rewrite.
4
3 * emacs-lisp/eieio.el (object-slots): Return slot names as before 5 * emacs-lisp/eieio.el (object-slots): Return slot names as before
4 (bug#20141). 6 (bug#20141).
5 7
diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el
index 4706be5e57c..0e8a969a402 100644
--- a/lisp/emacs-lisp/pcase.el
+++ b/lisp/emacs-lisp/pcase.el
@@ -166,23 +166,26 @@ like `(,a . ,(pred (< a))) or, with more checks:
166 166
167;;;###autoload 167;;;###autoload
168(defmacro pcase-lambda (lambda-list &rest body) 168(defmacro pcase-lambda (lambda-list &rest body)
169 "Like `lambda' but allow each argument to be a pattern. 169 "Like `lambda' but allow each argument to be a UPattern.
170`&rest' argument is supported." 170I.e. accepts the usual &optional and &rest keywords, but every
171formal argument can be any pattern accepted by `pcase' (a mere
172variable name being but a special case of it)."
171 (declare (doc-string 2) (indent defun) 173 (declare (doc-string 2) (indent defun)
172 (debug ((&rest pcase-UPAT &optional ["&rest" pcase-UPAT]) body))) 174 (debug ((&rest pcase-UPAT) body)))
173 (let ((args (make-symbol "args")) 175 (let* ((bindings ())
174 (pats (mapcar (lambda (u) 176 (parsed-body (macroexp-parse-body body))
175 (unless (eq u '&rest) 177 (args (mapcar (lambda (pat)
176 (if (eq (car-safe u) '\`) (cadr u) (list '\, u)))) 178 (if (symbolp pat)
177 lambda-list)) 179 ;; Simple vars and &rest/&optional are just passed
178 (body (macroexp-parse-body body))) 180 ;; through unchanged.
179 ;; Handle &rest 181 pat
180 (when (eq nil (car (last pats 2))) 182 (let ((arg (make-symbol
181 (setq pats (append (butlast pats 2) (car (last pats))))) 183 (format "arg%s" (length bindings)))))
182 `(lambda (&rest ,args) 184 (push `(,pat ,arg) bindings)
183 ,@(car body) 185 arg)))
184 (pcase ,args 186 lambda-list)))
185 (,(list '\` pats) . ,(cdr body)))))) 187 `(lambda ,args ,@(car parsed-body)
188 (pcase-let* ,(nreverse bindings) ,@(cdr parsed-body)))))
186 189
187(defun pcase--let* (bindings body) 190(defun pcase--let* (bindings body)
188 (cond 191 (cond