scopelispcommon-lispliterals

Why does this function return a different value every time?


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?


Solution

  • '(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.