[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.
Очевидно, что компиляция и загрузка исходника не привела к удалению тех функций, которые в нем не были объявлены.
Просто код накатился на существующий контекст: новые функции добавились, существующие переопределились, а старые остались без изменений.
А хотелось бы иметь возможность загружать код в чистый контекст, чтобы быть уверенным, что программа сможет работать "с нуля".
--
Дмитро
Re: [Common Lisp] REPL, reinit
От: kzn Россия  
Дата: 25.06.08 11:54
Оценка: 8 (1)
D>Очевидно, что компиляция и загрузка исходника не привела к удалению тех функций, которые в нем не были объявлены.
D>Просто код накатился на существующий контекст: новые функции добавились, существующие переопределились, а старые остались без изменений.
D>А хотелось бы иметь возможность загружать код в чистый контекст, чтобы быть уверенным, что программа сможет работать "с нуля".

Например использовать систему пакетов(package). Если надо что-то заново загрузить, то сначала удалить пакет с помощью delete-package, а потом заново его создать.
Но, вряд ли CL отреагирует хорошо на подобные действия с CL-USER.
Re: [Common Lisp] REPL, reinit
От: MasterZiv СССР  
Дата: 02.07.08 11:01
Оценка: 8 (1)
dshe пишет:
> Тем не менее в REPL работает как hello, так и hello-new.
> Очевидно, что компиляция и загрузка исходника не привела к удалению тех
> функций, которые в нем не были объявлены.

И не должна была она пропасть. Если хочешь, чтобы пропала — надо удалять функцию
явно. Например, можешь дропнуть свой пакет.

delete-package package => generalized-boolean

> Просто код накатился на существующий контекст: новые функции добавились,

> существующие переопределились, а старые остались без изменений.
Да, именно так.

> А хотелось бы иметь возможность загружать код в чистый контекст, чтобы

> быть уверенным, что программа сможет работать "с нуля".

Нет, такой возможности нет.
Надо перегрузить SBCL, это SLIME умеет.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: [Common Lisp] REPL, reinit
От: dshe  
Дата: 03.07.08 14:56
Оценка:
Здравствуйте, 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 перегружают? Или что-то еще?...
--
Дмитро
slime common lisp repl
Re[3]: [Common Lisp] REPL, reinit
От: MasterZiv СССР  
Дата: 07.07.08 09:17
Оценка: 4 (1)
dshe пишет:

> Да. "M-x slime-restart-inferior-lisp" вроде бы работает (не уверен,

> правда, что это также будет работать с remote процессом).
> Однако, что-то мне подсказывает, что это не Lisp Way.

Lisp, Lisp way...

Собственно, вопрос
> можно переформулировать так: как lisp'еры предотвращают опасность
> рассогласования того, что имеется в REPL сессии, в тем, что находится в
> исходниках?

Перегружают все файлы. Например, помогают проекты на ASDF.

Неужели полагаются на свою память и ручками прибивают те
> объекты, которые были удалены (функции, переменные) / изменены (пакеты)
> в исходниках ? Или целиком lisp перегружают? Или что-то еще?...

Уже же сказали, если совсем невмоготу, дропаете все ваши пакеты
и загружаете код заново.
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.