diff options
-rw-r--r-- | lisp/emacs-lisp/map.el | 13 | ||||
-rw-r--r-- | test/automated/map-tests.el | 1 |
2 files changed, 12 insertions, 2 deletions
diff --git a/lisp/emacs-lisp/map.el b/lisp/emacs-lisp/map.el index 06fd7ad2957..2c95f35569c 100644 --- a/lisp/emacs-lisp/map.el +++ b/lisp/emacs-lisp/map.el @@ -48,11 +48,11 @@ "Perform a lookup in MAP of KEY and return its associated value. If KEY is not found, return DEFAULT which defaults to nil. -If MAP is a list, `assoc' is used to lookup KEY." +If MAP is a list, `equal' is used to lookup KEY." (map--dispatch map :list (or (cdr (assoc key map)) default) :hash-table (gethash key map default) - :array (or (ignore-errors (elt map key)) default))) + :array (map--elt-array map key default))) (defmacro map-put (map key value) "In MAP, associate KEY with VALUE and return MAP. @@ -252,6 +252,15 @@ form. (setq index (1+ index)))) map))) +(defun map--elt-array (map key &optional default) + "Return the element of the arary MAP at the index KEY, or DEFAULT if nil." + (let ((len (seq-length map))) + (or (and (>= key 0) + (<= key len) + (seq-elt map key)) + default))) + + (defun map--delete-alist (map key) "Return MAP with KEY removed." (seq-remove (lambda (pair) diff --git a/test/automated/map-tests.el b/test/automated/map-tests.el index 9a0d99e04de..f41cd70c4c5 100644 --- a/test/automated/map-tests.el +++ b/test/automated/map-tests.el @@ -59,6 +59,7 @@ Evaluate BODY for each created map. (assert (= 3 (map-elt map 0))) (assert (= 4 (map-elt map 1))) (assert (= 5 (map-elt map 2))) + (assert (null (map-elt map -1))) (assert (null (map-elt map 4))))) (ert-deftest test-map-elt-default () |