Вот что ещё.
> Олег
делать корректное сохранение всех используемых переменных в начале своей программы и восстановленивать - в конце
Только не "своей программы", а "своей КОМАНДЫ". Потому что программа грузится, как правило, из файла acaddoc.lsp или ему подобных (список этих файлов можно просмотреть командой _appload), при открытии каждого чертежа.
Но после того, как программа загрузится, и до того, как юзер вызовет первую вашу КОМАНДУ, чужая "вандальская" программа (или её команда, вызванная юзером) может испортить "ваши" системные переменные.
А вот команда, насколько я знаю, исполняется монопольно (прозрачные команды типа 'PAN не опасны), то есть как транзакция, в терминах теории СУБД.
А что, если капризный юзер прервёт вашу команду клавишей Esc ? Тогда надо предусмотреть восстановление системных переменных из функции-обработчика ошибок, и кстати, восстановить саму функцию *error*.
Вот пример простейшего, но "правильного" обработчика ошибок:
(defun myErrorHandler (msg / )
(if oldError (setq *error* oldError))
(if oldOsmode (setvar "osmode" oldOsmode))
...
(princ msg) ;-- где-то я читал, что обработчик ошибок обязан включать в себя функцию вывода сообщения. Может, я и неправ...
(princ) ;-- "тихий" выход в консоль.
)
...
(defun myCommand ( / locvar1 locvar2 locvar3)
(setq oldError *error*)
(setq *error* myErrorHandler)
(setq oldOsmode (getvar "osmode"))
(setvar "osmode" 0) ;-- например, ноль
...
(if oldOsmode (setvar "osmode" oldOsmode))
(if oldError (setq *error* oldError))
)
Здесь oldError и oldOsmode - обязательно глобальные переменные, а не локальные.