diff options
| author | Nicolas Petton | 2015-04-24 19:29:59 +0200 |
|---|---|---|
| committer | Nicolas Petton | 2015-04-24 19:29:59 +0200 |
| commit | d75151a671dcdc1cac8c6ab1a47520bae4872d70 (patch) | |
| tree | 0b680ef21bb81cf0f3e0bce37426545f5f1d056b | |
| parent | 79d9757c2334364a78a2e40b75d8d4e96161a911 (diff) | |
| download | emacs-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.el | 11 | ||||
| -rw-r--r-- | test/automated/map-tests.el | 5 |
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))) |