Dlaczego zmienna lokalna elisp zachowuje w tym przypadku swoją wartość?

Czy ktoś mógłby mi wyjaśnić, co się dzieje w tym bardzo prostym fragmencie kodu?

(defun test-a ()
  (let ((x '(nil)))
    (setcar x (cons 1 (car x)))
    x))

Na wezwanie(test-a) po raz pierwszy otrzymuję oczekiwany wynik:((1)). Ale ku mojemu zdziwieniu, dzwonię do niego jeszcze raz((1 1)), ((1 1 1)) i tak dalej. Dlaczego to się dzieje? Czy źle się spodziewam(test-a) zawsze wracać((1))? Zauważ również, że po ponownej ocenie definicjitest-a, wynik powrotu jest resetowany.

Weź również pod uwagę, że ta funkcja działa tak, jak oczekuję:

(defun test-b ()
  (let ((x '(nil)))
    (setq x (cons (cons 1 (car x)) 
                  (cdr x)))))

(test-b) zawsze wraca((1)). Dlaczego nietest-a itest-b odpowiednik?

questionAnswers(3)

yourAnswerToTheQuestion