Do not signal an error when trying to delete a key from an array
* lisp/emacs-lisp/map.el (map-delete): When map is an array, check if the key is present to avoid signaling an error. * test/automated/map-tests.el: Add a test for deleting non-existing keys from maps.
This commit is contained in:
parent
79d9757c23
commit
d75151a671
2 changed files with 13 additions and 3 deletions
|
@ -73,7 +73,7 @@ If MAP is an array, store nil at the index KEY."
|
||||||
(map--dispatch (m ,map m)
|
(map--dispatch (m ,map m)
|
||||||
:list (setq ,map (map--delete-alist m ,key))
|
:list (setq ,map (map--delete-alist m ,key))
|
||||||
:hash-table (remhash ,key m)
|
:hash-table (remhash ,key m)
|
||||||
:array (aset m ,key nil))))
|
:array (map--delete-array m ,key))))
|
||||||
|
|
||||||
(defun map-nested-elt (map keys &optional default)
|
(defun map-nested-elt (map keys &optional default)
|
||||||
"Travserse MAP using KEYS and return the looked up value or DEFAULT if nil.
|
"Travserse MAP using KEYS and return the looked up value or DEFAULT if nil.
|
||||||
|
@ -261,13 +261,20 @@ form.
|
||||||
(seq-elt map key))
|
(seq-elt map key))
|
||||||
default)))
|
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)
|
||||||
(equal key (car pair)))
|
(equal key (car pair)))
|
||||||
map))
|
map))
|
||||||
|
|
||||||
|
(defun map--delete-array (map key)
|
||||||
|
"Set nil in the array MAP at the index KEY if present and return MAP."
|
||||||
|
(let ((len (seq-length map)))
|
||||||
|
(and (>= key 0)
|
||||||
|
(<= key len)
|
||||||
|
(aset m key nil)))
|
||||||
|
map)
|
||||||
|
|
||||||
(defun map--into-hash-table (map)
|
(defun map--into-hash-table (map)
|
||||||
"Convert MAP into a hash-table."
|
"Convert MAP into a hash-table."
|
||||||
(let ((ht (make-hash-table :size (map-length map)
|
(let ((ht (make-hash-table :size (map-length map)
|
||||||
|
|
|
@ -96,7 +96,10 @@ Evaluate BODY for each created map.
|
||||||
(ert-deftest test-map-delete ()
|
(ert-deftest test-map-delete ()
|
||||||
(with-maps-do map
|
(with-maps-do map
|
||||||
(map-delete map 1)
|
(map-delete map 1)
|
||||||
(assert (null (map-elt map 1)))))
|
(assert (null (map-elt map 1))))
|
||||||
|
(with-maps-do map
|
||||||
|
(map-delete map -2)
|
||||||
|
(assert (null (map-elt map -2)))))
|
||||||
|
|
||||||
(ert-deftest test-map-delete-return-value ()
|
(ert-deftest test-map-delete-return-value ()
|
||||||
(let ((ht (make-hash-table)))
|
(let ((ht (make-hash-table)))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue