Minor improvement in map-elt.

* lisp/emacs-lisp/map.el (map-elt): Do not use `ignore-errors' when
doing a lookup in arrays, but check the boundaries of the array
instead.

* test/automated/map-tests.el: Adds a test for `map-elt' with arrays
and a negative integer as key.
This commit is contained in:
Nicolas Petton 2015-04-24 19:06:27 +02:00
parent 89baf16332
commit f37e265ea9
2 changed files with 12 additions and 2 deletions

View file

@ -48,11 +48,11 @@
"Perform a lookup in MAP of KEY and return its associated value. "Perform a lookup in MAP of KEY and return its associated value.
If KEY is not found, return DEFAULT which defaults to nil. 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 (map--dispatch map
:list (or (cdr (assoc key map)) default) :list (or (cdr (assoc key map)) default)
:hash-table (gethash 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) (defmacro map-put (map key value)
"In MAP, associate KEY with VALUE and return MAP. "In MAP, associate KEY with VALUE and return MAP.
@ -252,6 +252,15 @@ form.
(setq index (1+ index)))) (setq index (1+ index))))
map))) 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) (defun map--delete-alist (map key)
"Return MAP with KEY removed." "Return MAP with KEY removed."
(seq-remove (lambda (pair) (seq-remove (lambda (pair)

View file

@ -59,6 +59,7 @@ Evaluate BODY for each created map.
(assert (= 3 (map-elt map 0))) (assert (= 3 (map-elt map 0)))
(assert (= 4 (map-elt map 1))) (assert (= 4 (map-elt map 1)))
(assert (= 5 (map-elt map 2))) (assert (= 5 (map-elt map 2)))
(assert (null (map-elt map -1)))
(assert (null (map-elt map 4))))) (assert (null (map-elt map 4)))))
(ert-deftest test-map-elt-default () (ert-deftest test-map-elt-default ()