Tino Calancha <tino.calancha@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.
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))