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
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Tino Calancha <tino.calancha <at> gmail.com> writes:
> (cl-loop for i below 3 collect
> (let ((map (list (cons 0 3)
> (cons 1 4)
> (cons 2 5))))
> (map-delete map i)
> (null (map-elt map i))))
> => (nil t t) ; The first pair, i.e. '(0 . 3) is not permanently deleted.
>
> I've used the word 'permantly' because it seems it is temporary
> deleted:
>
> (cl-loop for i below 3 collect
> (let ((map (list (cons 0 3)
> (cons 1 4)
> (cons 2 5))))
> (null (map-elt
> (map-delete map i)
> i))))
> => (t t t)
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:
(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
(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))
WDYT?
Cheers,
Nico
[signature.asc (application/pgp-signature, inline)]
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.