|
From: | Tino Calancha |
Subject: | bug#25929: 25.2; map-delete doesn't delete permanently 1st alist elt |
Date: | Thu, 2 Mar 2017 22:34:29 +0900 (JST) |
User-agent: | Alpine 2.20 (DEB 67 2015-01-07) |
On Thu, 2 Mar 2017, Nicolas Petton wrote:
Nicolas Petton <nicolas@petton.fr> writes:The alist is indeed modified within the `map-delete' function, but in an unexpected way: if the first key is deleted, the variable `map' is `setq'ed, which has no effect outside of the function. One fix would be to make `map-delete' a macro:Here's a fixed version: (defmacro map-delete (map key) "Delete KEY from MAP and return MAP. No error is signaled if KEY is not a key of MAP. If MAP is an array, store nil at the index KEY. MAP can be a list, hash-table or array." (macroexp-let2 nil key `(progn (map--dispatch ,map :list (setf (alist-get ,key ,map nil t) nil) :hash-table (remhash ,key ,map) :array (and (>= ,key 0) (<= ,key (seq-length ,map)) (aset ,map ,key nil))) ,map))) And the associated regression test: (ert-deftest test-map-delete-first-key-alist () (let ((alist '((a . 1) (b . 2) (c . 3)))) (map-delete alist 'a) (should (null (map-elt alist 'a)))))
Sorry, i don't understand why following doesn't work after the patch: ;; I have byte-compiled map.el after applying the patch. emacs -Q (let ((alist '((a . 1) (b . 2) (c . 3)))) (map-delete alist 'a) (map-elt alist 'a)) Debugger entered--Lisp error: (void-function map--dispatch) We shouldn't ask the user to compile the file on each interactive session in order to `map--dispatch' be defined. We might also mention in the doc strings that MAP must be a generalized variable or something. To explain that I) below is allowed but II) is not: I) (assq-delete-all 'foo '((foo . 1) (bar . 2))) II) (map-delete '((foo . 1) (bar . 2)) 'foo) Regards, Tino
[Prev in Thread] | Current Thread | [Next in Thread] |