[Common Lisp] REPL, reinit
От: dshe  
Дата: 25.06.08 08:24
Оценка:
Привет всем,

Как можно после ряда компиляций и загрузки файлов привести 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.
Очевидно, что компиляция и загрузка исходника не привела к удалению тех функций, которые в нем не были объявлены.
Просто код накатился на существующий контекст: новые функции добавились, существующие переопределились, а старые остались без изменений.
А хотелось бы иметь возможность загружать код в чистый контекст, чтобы быть уверенным, что программа сможет работать "с нуля".
--
Дмитро
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.