Как можно после ряда компиляций и загрузки файлов привести 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
Тем не менее в REPL работает как hello, так и hello-new.
Очевидно, что компиляция и загрузка исходника не привела к удалению тех функций, которые в нем не были объявлены.
Просто код накатился на существующий контекст: новые функции добавились, существующие переопределились, а старые остались без изменений.
А хотелось бы иметь возможность загружать код в чистый контекст, чтобы быть уверенным, что программа сможет работать "с нуля".
D>Очевидно, что компиляция и загрузка исходника не привела к удалению тех функций, которые в нем не были объявлены. D>Просто код накатился на существующий контекст: новые функции добавились, существующие переопределились, а старые остались без изменений. D>А хотелось бы иметь возможность загружать код в чистый контекст, чтобы быть уверенным, что программа сможет работать "с нуля".
Например использовать систему пакетов(package). Если надо что-то заново загрузить, то сначала удалить пакет с помощью delete-package, а потом заново его создать.
Но, вряд ли CL отреагирует хорошо на подобные действия с CL-USER.
dshe пишет: > Тем не менее в REPL работает как hello, так и hello-new. > Очевидно, что компиляция и загрузка исходника не привела к удалению тех > функций, которые в нем не были объявлены.
И не должна была она пропасть. Если хочешь, чтобы пропала — надо удалять функцию
явно. Например, можешь дропнуть свой пакет.
delete-package package => generalized-boolean
> Просто код накатился на существующий контекст: новые функции добавились, > существующие переопределились, а старые остались без изменений.
Да, именно так.
> А хотелось бы иметь возможность загружать код в чистый контекст, чтобы > быть уверенным, что программа сможет работать "с нуля".
Нет, такой возможности нет.
Надо перегрузить SBCL, это SLIME умеет.
Здравствуйте, MasterZiv, Вы писали:
MZ>dshe пишет: >> Тем не менее в REPL работает как hello, так и hello-new. >> Очевидно, что компиляция и загрузка исходника не привела к удалению тех >> функций, которые в нем не были объявлены.
MZ>И не должна была она пропасть. Если хочешь, чтобы пропала — надо удалять функцию MZ>явно. Например, можешь дропнуть свой пакет.
>> А хотелось бы иметь возможность загружать код в чистый контекст, чтобы >> быть уверенным, что программа сможет работать "с нуля".
MZ>Нет, такой возможности нет. MZ>Надо перегрузить SBCL, это SLIME умеет.
Да. "M-x slime-restart-inferior-lisp" вроде бы работает (не уверен, правда, что это также будет работать с remote процессом).
Однако, что-то мне подсказывает, что это не Lisp Way. Собственно, вопрос можно переформулировать так: как lisp'еры предотвращают опасность рассогласования того, что имеется в REPL сессии, в тем, что находится в исходниках? Неужели полагаются на свою память и ручками прибивают те объекты, которые были удалены (функции, переменные) / изменены (пакеты) в исходниках ? Или целиком lisp перегружают? Или что-то еще?...
dshe пишет:
> Да. "M-x slime-restart-inferior-lisp" вроде бы работает (не уверен, > правда, что это также будет работать с remote процессом). > Однако, что-то мне подсказывает, что это не Lisp Way.
Lisp, Lisp way...
Собственно, вопрос > можно переформулировать так: как lisp'еры предотвращают опасность > рассогласования того, что имеется в REPL сессии, в тем, что находится в > исходниках?
Перегружают все файлы. Например, помогают проекты на ASDF.
Неужели полагаются на свою память и ручками прибивают те > объекты, которые были удалены (функции, переменные) / изменены (пакеты) > в исходниках ? Или целиком lisp перегружают? Или что-то еще?...
Уже же сказали, если совсем невмоготу, дропаете все ваши пакеты
и загружаете код заново.