(setq ali '()) >>> nil (cl-incf (alist-get 'a ali 0)) >>> ((a . 1)) (setf (alist-get 'b ali) 0) >>> ((b . 0) (a . 1)) (cl-incf (alist-get 'b ali 0)) >>> 1
As you can see,
cl-incf returns different kinds of values in the second and the fourth expressions.
cl-incf per documentation is supposed to return "the incremented value of PLACE", however as we can see with the key
'a it returns the whole
ali structure. If we macroexpand it a few times, it's clear what's happening:
(let* ((p (if (and nil (not (eq nil 'eq))) (assoc 'a ali nil) (assq 'a ali))) (v (+ (if p (cdr p) 0) 1))) (if p (setcdr p v) (setq ali (cons (setq p (cons 'a v)) ali))))
setq is applied to
ali, so it returns the new value of
It seems to be a bug in the alist generalized variable definition.
Am I correct? If so, how to report it?
If not, what's the idiomatic way to work around it, preferably not calling
alist-get two times?