diff options
| author | Stefan Monnier | 2015-03-19 13:46:36 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2015-03-19 13:46:36 -0400 |
| commit | 8aa13d07fe72b8a00ded10602f5c5ce773181b40 (patch) | |
| tree | e379696ae1b93ee351e18ba102c12c7ce92bcf2e | |
| parent | 29f7f98b7c3755f8f9e9dcef60bd460794cf2104 (diff) | |
| download | emacs-8aa13d07fe72b8a00ded10602f5c5ce773181b40.tar.gz emacs-8aa13d07fe72b8a00ded10602f5c5ce773181b40.zip | |
* lisp/emacs-lisp/pcase.el (pcase-lambda): Rewrite.
| -rw-r--r-- | lisp/ChangeLog | 2 | ||||
| -rw-r--r-- | lisp/emacs-lisp/pcase.el | 35 |
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 @@ | |||
| 1 | 2015-03-19 Stefan Monnier <monnier@iro.umontreal.ca> | 1 | 2015-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." | 170 | I.e. accepts the usual &optional and &rest keywords, but every |
| 171 | formal argument can be any pattern accepted by `pcase' (a mere | ||
| 172 | variable 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 |