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.
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)