mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-06 06:20:55 -08:00
* lisp/emacs-lisp/map.el: Add keyword-only pattern abbreviation
* lisp/emacs-lisp/map.el: Update version to 2.1. ((pcase-defmacro map)): Update docstring. (map--make-pcase-bindings): Match keyword pattern. * test/lisp/emacs-lisp/map-tests.el (test-map-plist-pcase): Add test.
This commit is contained in:
parent
b641c178ce
commit
e287da5a81
3 changed files with 23 additions and 6 deletions
6
etc/NEWS
6
etc/NEWS
|
|
@ -115,6 +115,12 @@ supplied error message.
|
||||||
*** New connection method "media", which allows accessing media devices
|
*** New connection method "media", which allows accessing media devices
|
||||||
like cell phones, tablets or cameras.
|
like cell phones, tablets or cameras.
|
||||||
|
|
||||||
|
** map.el
|
||||||
|
|
||||||
|
*** Pcase 'map' pattern added keyword symbols abbreviation.
|
||||||
|
A pattern like '(map :sym)' binds the map's value for ':sym' to 'sym',
|
||||||
|
equivalent to '(map (:sym sym))'.
|
||||||
|
|
||||||
|
|
||||||
* New Modes and Packages in Emacs 28.1
|
* New Modes and Packages in Emacs 28.1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
;; Author: Nicolas Petton <nicolas@petton.fr>
|
;; Author: Nicolas Petton <nicolas@petton.fr>
|
||||||
;; Keywords: convenience, map, hash-table, alist, array
|
;; Keywords: convenience, map, hash-table, alist, array
|
||||||
;; Version: 2.0
|
;; Version: 2.1
|
||||||
;; Package-Requires: ((emacs "25"))
|
;; Package-Requires: ((emacs "25"))
|
||||||
;; Package: map
|
;; Package: map
|
||||||
|
|
||||||
|
|
@ -56,8 +56,10 @@ evaluated and searched for in the map. The match fails if for any KEY
|
||||||
found in the map, the corresponding PAT doesn't match the value
|
found in the map, the corresponding PAT doesn't match the value
|
||||||
associated to the KEY.
|
associated to the KEY.
|
||||||
|
|
||||||
Each element can also be a SYMBOL, which is an abbreviation of a (KEY
|
Each element can also be a SYMBOL, which is an abbreviation of
|
||||||
PAT) tuple of the form (\\='SYMBOL SYMBOL).
|
a (KEY PAT) tuple of the form (\\='SYMBOL SYMBOL). When SYMBOL
|
||||||
|
is a keyword, it is an abbreviation of the form (:SYMBOL SYMBOL),
|
||||||
|
useful for binding plist values.
|
||||||
|
|
||||||
Keys in ARGS not found in the map are ignored, and the match doesn't
|
Keys in ARGS not found in the map are ignored, and the match doesn't
|
||||||
fail."
|
fail."
|
||||||
|
|
@ -486,9 +488,12 @@ Example:
|
||||||
(defun map--make-pcase-bindings (args)
|
(defun map--make-pcase-bindings (args)
|
||||||
"Return a list of pcase bindings from ARGS to the elements of a map."
|
"Return a list of pcase bindings from ARGS to the elements of a map."
|
||||||
(seq-map (lambda (elt)
|
(seq-map (lambda (elt)
|
||||||
(if (consp elt)
|
(cond ((consp elt)
|
||||||
`(app (pcase--flip map-elt ,(car elt)) ,(cadr elt))
|
`(app (pcase--flip map-elt ,(car elt)) ,(cadr elt)))
|
||||||
`(app (pcase--flip map-elt ',elt) ,elt)))
|
((keywordp elt)
|
||||||
|
(let ((var (intern (substring (symbol-name elt) 1))))
|
||||||
|
`(app (pcase--flip map-elt ,elt) ,var)))
|
||||||
|
(t `(app (pcase--flip map-elt ',elt) ,elt))))
|
||||||
args))
|
args))
|
||||||
|
|
||||||
(defun map--make-pcase-patterns (args)
|
(defun map--make-pcase-patterns (args)
|
||||||
|
|
|
||||||
|
|
@ -376,5 +376,11 @@ Evaluate BODY for each created map.
|
||||||
'((1 . 1) (2 . 5) (3 . 0)))
|
'((1 . 1) (2 . 5) (3 . 0)))
|
||||||
'((3 . 0) (2 . 9) (1 . 6)))))
|
'((3 . 0) (2 . 9) (1 . 6)))))
|
||||||
|
|
||||||
|
(ert-deftest test-map-plist-pcase ()
|
||||||
|
(let ((plist '(:one 1 :two 2)))
|
||||||
|
(should (equal (pcase-let (((map :one (:two two)) plist))
|
||||||
|
(list one two))
|
||||||
|
'(1 2)))))
|
||||||
|
|
||||||
(provide 'map-tests)
|
(provide 'map-tests)
|
||||||
;;; map-tests.el ends here
|
;;; map-tests.el ends here
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue