mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-06 06:20:55 -08:00
(pcase): New _ syntax in pred/app functions
The current syntax for functions in `app` and `pred` patterns allows a shorthand (F ARGS) where the object being matched is added as an extra last argument. This is nice for things like (pred (< 5)) but sometimes the object needs to be at another position. Until now you had to use (pred (lambda (x) (memq x my-list))) or (pred (pcase--flip memq my-list)) in those cases. So, introduce a new shorthand where `_` can be used to indicate where the object should be passed: (pred (memq _ my-list)) * lisp/emacs-lisp/pcase.el (pcase--split-pred): Document new syntax for pred/app functions. (pcase--funcall): Support new syntax. (pcase--flip): Declare obsolete. (pcase--u1, \`): Use `_` instead. (pcase--split-pred): Adjust accordingly. * doc/lispref/control.texi (pcase Macro): Document new syntax for pred/app functions. * lisp/progmodes/opascal.el (pcase-defmacro): * lisp/emacs-lisp/seq.el (seq--make-pcase-bindings): * lisp/emacs-lisp/eieio.el (eieio): * lisp/emacs-lisp/cl-macs.el (cl-struct, cl-type): Use _ instead of `pcase--flip`. (cl--pcase-mutually-exclusive-p): Adjust accordingly. * lisp/emacs-lisp/map.el (map--pcase-map-elt): Declare obsolete. (map--make-pcase-bindings): Use `_` instead.
This commit is contained in:
parent
9ebc91795f
commit
806759dc0a
8 changed files with 47 additions and 24 deletions
|
|
@ -3344,14 +3344,14 @@ Elements of FIELDS can be of the form (NAME PAT) in which case the
|
|||
contents of field NAME is matched against PAT, or they can be of
|
||||
the form NAME which is a shorthand for (NAME NAME)."
|
||||
(declare (debug (sexp &rest [&or (sexp pcase-PAT) sexp])))
|
||||
`(and (pred (pcase--flip cl-typep ',type))
|
||||
`(and (pred (cl-typep _ ',type))
|
||||
,@(mapcar
|
||||
(lambda (field)
|
||||
(let* ((name (if (consp field) (car field) field))
|
||||
(pat (if (consp field) (cadr field) field)))
|
||||
`(app ,(if (eq (cl-struct-sequence-type type) 'list)
|
||||
`(nth ,(cl-struct-slot-offset type name))
|
||||
`(pcase--flip aref ,(cl-struct-slot-offset type name)))
|
||||
`(aref _ ,(cl-struct-slot-offset type name)))
|
||||
,pat)))
|
||||
fields)))
|
||||
|
||||
|
|
@ -3368,13 +3368,13 @@ the form NAME which is a shorthand for (NAME NAME)."
|
|||
"Extra special cases for `cl-typep' predicates."
|
||||
(let* ((x1 pred1) (x2 pred2)
|
||||
(t1
|
||||
(and (eq 'pcase--flip (car-safe x1)) (setq x1 (cdr x1))
|
||||
(eq 'cl-typep (car-safe x1)) (setq x1 (cdr x1))
|
||||
(and (eq 'cl-typep (car-safe x1)) (setq x1 (cdr x1))
|
||||
(eq '_ (car-safe x1)) (setq x1 (cdr x1))
|
||||
(null (cdr-safe x1)) (setq x1 (car x1))
|
||||
(eq 'quote (car-safe x1)) (cadr x1)))
|
||||
(t2
|
||||
(and (eq 'pcase--flip (car-safe x2)) (setq x2 (cdr x2))
|
||||
(eq 'cl-typep (car-safe x2)) (setq x2 (cdr x2))
|
||||
(and (eq 'cl-typep (car-safe x2)) (setq x2 (cdr x2))
|
||||
(eq '_ (car-safe x2)) (setq x2 (cdr x2))
|
||||
(null (cdr-safe x2)) (setq x2 (car x2))
|
||||
(eq 'quote (car-safe x2)) (cadr x2))))
|
||||
(or
|
||||
|
|
@ -3818,7 +3818,8 @@ STRUCT-TYPE and SLOT-NAME are symbols. INST is a structure instance."
|
|||
(pcase-defmacro cl-type (type)
|
||||
"Pcase pattern that matches objects of TYPE.
|
||||
TYPE is a type descriptor as accepted by `cl-typep', which see."
|
||||
`(pred (pcase--flip cl-typep ',type)))
|
||||
`(pred (cl-typep _ ',type)))
|
||||
|
||||
|
||||
;; Local variables:
|
||||
;; generated-autoload-file: "cl-loaddefs.el"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue