Переменная - это поле, которое содержит значение. Ячейка минуса (например, начало списка, который вы помещаете в *temp*
) - это место в памяти с некоторыми указателями. Когда вы делаете (let ((temp *temp*)) ...
, вы заставляете переменную temp
указывать на тот же бит памяти, что и *temp*
, поэтому, когда вы изменяете эту структуру данных, вы модифицируете ту же самую память, на которую указывает *temp*
.
Один из способов исправить ваш код - попытаться увидеть, как обычно пишутся программы на lisp, и сделать ваш код более похожим на него, вместо того, чтобы применять свои знания о том, как писать программы на C, для языка с совершенно другой семантикой (в частности, Common Lisp не имеет семантики значений, как C). Одним из улучшений было бы создание нужных вам данных вместо того, чтобы тыкать в них палочками для еды (например, set-key
и друзья).
Я не могу выполнить ваш код, потому что вы не предоставили минимальный исполняемый пример, но вы можете создать одну строку из желаемого результата, выполнив что-то вроде:
`((key ,what-you-want-for-first-value)
(key2 ,second-value)
(key3 ,third))
Это создаст новый объект в новой памяти.