я определил специальный переменный * несортированный-LST * и функцию для переустановки этого переменного в моем сценарии:SETF в функции не работает
(defparameter *unsorted-lst* nil)
(defun reset-to-unsorted-list()
(setf *unsorted-lst* '(1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44))
(format t "after reset: ~a~%" *unsorted-lst*)
)
После этого я скопировать их SBCL консоли для тестирования, я :
* (setf *unsorted-lst* '(1 2 3))
(1 2 3)
* (reset-to-unsorted-list)
after reset: (1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44)
NIL
Все работает нормально. Тогда я сделал
* (setf (second *unsorted-lst*) 100)
100
* (reset-to-unsorted-list)
after reset: (1 100 0 22 3 1 3 299 31 5 0 3 7 96 24 44)
NIL
SETF в функции, кажется, не работает, а второе значение элемента все еще было 100. Это действительно запутать меня. Мне нужно было ввести команду setf прямо в консоли, чтобы внести смену:
* (setf *unsorted-lst* '(1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44))
(1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44)
* *unsorted-lst*
(1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44)
Теперь это работает. Я не могу сказать, что это не так? Есть некоторые недоразумения setf? или переменной?
возможно дубликат [Неожиданное сохранение данных] (http://stackoverflow.com/questions/18790192/unexpected-persistence-of-data) –
Буквенный данные _literal data_. Если вы знакомы с C или Java, вы можете подумать о цитируемом списке в 'reset-to-unsorted' как статическую переменную. Когда вы назначаете его значение переменной и изменяете базовый объект через эту переменную, вы меняете существующее значение _one_. –
@Joshua Taylor: это просто, что точные эффекты изменения литеральных данных не определены в Common Lisp. Таким образом, избегайте этого. Также я думаю, что общее направление вопроса немного другое: что мы можем сделать, чтобы убедиться, что функция безопасно сбрасывает переменную? –