Привет всем,
Как можно после ряда компиляций и загрузки файлов привести
Lisp image к такому состоянию, которое он имел непосредственно после старта?
Т.е. подчистить все binding'и, остановить запущенные потоки и прочее.
Объясню на примере.
Emacs + SLIME + SBCL
1) пишем функцию hello; компилируем; проверяем, что она работет
;;;; test.lisp
(defun hello ()
(format t "hello"))
C-c C-k slime-compile-and-load-file
CL-USER> (hello)
hello
NIL
2) добавляем функцию hello-new, которая ссылается на hello
;;;; test.lisp
(defun hello ()
(format t "hello"))
(defun hello-new ()
(hello))
C-c C-k slime-compile-and-load-file
CL-USER> (hello)
hello
NIL
CL-USER> (hello-new)
hello
NIL
3) удаляем hello, hello-new теперь ссылается на несуществующую (по крайней мере с исходниках) hello
;;;; test.lisp
(defun hello-new ()
(hello))
C-c C-k slime-compile-and-load-file
CL-USER> (hello)
hello
NIL
CL-USER> (hello-new)
hello
NIL
Тем не менее в REPL работает как hello, так и hello-new.
Очевидно, что компиляция и загрузка исходника не привела к удалению тех функций, которые в нем не были объявлены.
Просто код накатился на существующий контекст: новые функции добавились, существующие переопределились, а старые остались без изменений.
А хотелось бы иметь возможность загружать код в чистый контекст, чтобы быть уверенным, что программа сможет работать "с нуля".