Can someone explain the following behavior? Specifically, why does the function return a different list every time? Why isn't some-list
initialized to '(0 0 0)
every time the function is called?
(defun foo ()
(let ((some-list '(0 0 0)))
(incf (car some-list))
some-list))
Output:
> (foo)
(1 0 0)
> (foo)
(2 0 0)
> (foo)
(3 0 0)
> (foo)
(4 0 0)
Thanks!
EDIT:
Also, what is the recommended way of implementing this function, assuming I want the function to output '(1 0 0)
every time?
'(0 0 0)
is a literal object, which is assumed to be a constant (albeit not protected from modification). So you're effectively modifying the same object every time. To create different objects at each function call use (list 0 0 0)
.
So unless you know, what you're doing, you should always use literal lists (like '(0 0 0)
) only as constants.