Может кто-нибудь объяснить мне, что происходит в этом очень простом фрагменте кода?
(defun test-a ()
(let ((x '(nil)))
(setcar x (cons 1 (car x)))
x))
При вызове (test-a) в первый раз я получаю ожидаемый результат: ((1)).
Но, к моему удивлению, снова называя это, я получаю ((1 1)), ((1 1 1)) и так далее.
Почему это происходит? Неправильно ли ожидать, что (test-a) всегда будет возвращать ((1))?
Также обратите внимание, что после переоценки определения test-a результат возврата сбрасывается.
Также подумайте, что эта функция работает так, как я ожидаю:
(defun test-b ()
(let ((x '(nil)))
(setq x (cons (cons 1 (car x))
(cdr x)))))
(test-b) всегда возвращает ((1)).
Почему не эквивалентны test-a и test-b?