GNU bug report logs -
#25929
25.2; map-delete doesn't delete permanently 1st alist elt
Previous Next
Reported by: Tino Calancha <tino.calancha <at> gmail.com>
Date: Thu, 2 Mar 2017 07:19:01 UTC
Severity: normal
Found in version 25.2
Fixed in version 29.1
Done: Lars Ingebrigtsen <larsi <at> gnus.org>
Bug is archived. No further changes may be made.
Full log
Message #29 received at 25929 <at> debbugs.gnu.org (full text, mbox):
On Thu, 2 Mar 2017, Nicolas Petton wrote:
> Nicolas Petton <nicolas <at> 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
This bug report was last modified 3 years and 27 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.