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:
parent
89baf16332
commit
f37e265ea9
2 changed files with 12 additions and 2 deletions
|
@ -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)
|
||||||
|
|
|
@ -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 ()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue