]> code.delx.au - gnu-emacs/commitdiff
Minor improvement in map-elt.
authorNicolas Petton <nicolas@petton.fr>
Fri, 24 Apr 2015 17:06:27 +0000 (19:06 +0200)
committerNicolas Petton <nicolas@petton.fr>
Fri, 24 Apr 2015 17:10:45 +0000 (19:10 +0200)
* 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.

lisp/emacs-lisp/map.el
test/automated/map-tests.el

index 06fd7ad2957e90d65eb25acb8fecdee2974848f2..2c95f35569cd327ee9a8af5b69f30f1379d68dbd 100644 (file)
   "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)
index 9a0d99e04de84b8bb80da42452b664a9eb406de0..f41cd70c4c55c4ebb5e16e677a2daff81ee994ba 100644 (file)
@@ -59,6 +59,7 @@ Evaluate BODY for each created map.
     (assert (= 3 (map-elt map 0)))
     (assert (= 4 (map-elt map 1)))
     (assert (= 5 (map-elt map 2)))
+    (assert (null (map-elt map -1)))
     (assert (null (map-elt map 4)))))
 
 (ert-deftest test-map-elt-default ()