Может кто-нибудь объяснить мне, что происходит в этом очень простом фрагменте кода?
(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
?