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?