bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#25929: 25.2; map-delete doesn't delete permanently 1st alist elt


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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]