On Thu, 2 Mar 2017, Nicolas Petton wrote: > Tino Calancha 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)) > After this patch if i run the above recipe i get an error: let*: Symbol¢s function definition is void: map--dispatch