aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Petton2015-04-24 19:29:59 +0200
committerNicolas Petton2015-04-24 19:29:59 +0200
commitd75151a671dcdc1cac8c6ab1a47520bae4872d70 (patch)
tree0b680ef21bb81cf0f3e0bce37426545f5f1d056b
parent79d9757c2334364a78a2e40b75d8d4e96161a911 (diff)
downloademacs-d75151a671dcdc1cac8c6ab1a47520bae4872d70.tar.gz
emacs-d75151a671dcdc1cac8c6ab1a47520bae4872d70.zip
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.
-rw-r--r--lisp/emacs-lisp/map.el11
-rw-r--r--test/automated/map-tests.el5
2 files changed, 13 insertions, 3 deletions
diff --git a/lisp/emacs-lisp/map.el b/lisp/emacs-lisp/map.el
index 621c37f2b76..087ab286ac3 100644
--- a/lisp/emacs-lisp/map.el
+++ b/lisp/emacs-lisp/map.el
@@ -73,7 +73,7 @@ If MAP is an array, store nil at the index KEY."
73 (map--dispatch (m ,map m) 73 (map--dispatch (m ,map m)
74 :list (setq ,map (map--delete-alist m ,key)) 74 :list (setq ,map (map--delete-alist m ,key))
75 :hash-table (remhash ,key m) 75 :hash-table (remhash ,key m)
76 :array (aset m ,key nil)))) 76 :array (map--delete-array m ,key))))
77 77
78(defun map-nested-elt (map keys &optional default) 78(defun map-nested-elt (map keys &optional default)
79 "Travserse MAP using KEYS and return the looked up value or DEFAULT if nil. 79 "Travserse MAP using KEYS and return the looked up value or DEFAULT if nil.
@@ -261,13 +261,20 @@ form.
261 (seq-elt map key)) 261 (seq-elt map key))
262 default))) 262 default)))
263 263
264
265(defun map--delete-alist (map key) 264(defun map--delete-alist (map key)
266 "Return MAP with KEY removed." 265 "Return MAP with KEY removed."
267 (seq-remove (lambda (pair) 266 (seq-remove (lambda (pair)
268 (equal key (car pair))) 267 (equal key (car pair)))
269 map)) 268 map))
270 269
270(defun map--delete-array (map key)
271 "Set nil in the array MAP at the index KEY if present and return MAP."
272 (let ((len (seq-length map)))
273 (and (>= key 0)
274 (<= key len)
275 (aset m key nil)))
276 map)
277
271(defun map--into-hash-table (map) 278(defun map--into-hash-table (map)
272 "Convert MAP into a hash-table." 279 "Convert MAP into a hash-table."
273 (let ((ht (make-hash-table :size (map-length map) 280 (let ((ht (make-hash-table :size (map-length map)
diff --git a/test/automated/map-tests.el b/test/automated/map-tests.el
index f41cd70c4c5..5201116613e 100644
--- a/test/automated/map-tests.el
+++ b/test/automated/map-tests.el
@@ -96,7 +96,10 @@ Evaluate BODY for each created map.
96(ert-deftest test-map-delete () 96(ert-deftest test-map-delete ()
97 (with-maps-do map 97 (with-maps-do map
98 (map-delete map 1) 98 (map-delete map 1)
99 (assert (null (map-elt map 1))))) 99 (assert (null (map-elt map 1))))
100 (with-maps-do map
101 (map-delete map -2)
102 (assert (null (map-elt map -2)))))
100 103
101(ert-deftest test-map-delete-return-value () 104(ert-deftest test-map-delete-return-value ()
102 (let ((ht (make-hash-table))) 105 (let ((ht (make-hash-table)))