Nicolas Petton 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))))) Cheers, Nico