 |
- 88 -
Руководство пользователя по АВТОЛИСПу
Как только вы создаете новые функции и переменные , их имена заносятся
в оглавление ATOMLIST. Вы можете изъять любое ,обозначенное вами, из
того что есть в оригинале, прерыванием ATOMLISTа . Будьте внимательны,
однако, не прерывайте системных функций , иначе вы окажетесь в тупике.
Если вы поместите следующую функцию в ваш "acad.lsp" файл:
(defun C:CLEAN ()
(setq atomlist (member 'C:CLEAN atomlist))
'DONE
)
у вас будет возможность ввести команду CLEAN , всегда , когда вы хотите
сделать ATOMLIST аккуратным и получить обратно участок памяти node,
используемый всеми вашими функциями и переменными. Если C:CLEAN послед-
няя функция в вашем "acad.lsp" файле , функции, которые вы определяете
ранее в файле, будут сохранены , когда вы введете CLEAN. Функция CLEAN
сбрасывает только подпоследовательно определяемые( subsequently-defined)
функции и переменные, таким образом, все , что вы в " acad.lsp" опре-
делили раньше, обработается как системно определяемые функции.
ЗАПОМНИТЕ. Механизм ATOMLIST нестандартная особенность LISPа и
может быть изменена в будущих версиях AutoLISPа. К тому же, техни-
ка прерывания ATOMLISTа не може
т быть использована , когда имеется
возможность листания виртуальных функций. Смотри следующий раздел.
6. 3. Виртуальные страничные функции
Если применение вашего AutoLISPа становится слишком большим ,
чтобы быть впору имеющемуся участку памяти node (установленному пере-
менной SET в LISPHEAP , как описано выше), вы можете использовать
перелистыватель виртуальной функции AutoLISPа, чтобы позволить рост ва-
шей программы. Чтобы сделать это, просто выполните функцию:
(vmon)
перед первым DEFUN в вашей программе. Это позволит виртуальной функции
разбить память на страницы, для остатка сеанса AutoCAD Drawing Editor.
Однажды позволенная , функция разбиения памяти на страницы не отключает-
ся. Только функции, созданные через функции DEFUN ,следующие
за функцией VMON, подходят для разбиения памяти на страницы , а,
если у вас функции DEFUN перед VMON , они не будут разбивать память на
страницы и еще могут вызвать на терминал сообщение:
"Insufficient node space" Недостаточно памяти node
После того , как функция VMON выполнится, AutoLISP будет перелис-
тывать страницы редко используемых функций, всякий раз когда они за-
пускаются из памяти, и автоматически читать их снова, когда они понадо-
бятся. Вам не нужно беспокоиться об этом перелистывании,так как оно уп-
равляется автоматически, и это ясно из вашей программы.Эти функции вре-
менно перекачиваются в файл , через который управляется файл перелисты-
вателя страниц AutoCADа. Итак , когда вы имеете достаточно расширенную
или продленную память, обычно эта память будет перекачивать функции и
- 89 -
Руководство пользователя по АВТОЛИСПу
выдаст результат намного быстрее , чем свопинг(перекачка)на диск.
Запомните, что система с виртуальной памятью только листает функ-
ции: однако, вы должны иметь достаточный участок node памяти для разме-
щения всех списков (data lists) , использующихся в вашей программе, а
также функций и имен переменных. Следовательно, хотя листание страниц
позволяет прогнать большую программу со много меньшей памятью, вы ,одна-
ко, должны установить оптимальный размер участка heap и набор LISPHEAP
соответственно. То же самое относится к размеру участка stack и к набо-
ру LISPSTACK при работе с виртуальной памятью.
Технические замечания
Следующая информация полезна только опытным хакерам (программис-
там ) LISPа. Новички и те, кто играют, как правило, могут( и должны) иг-
норировать эту дискуссию.
После того , как функция VMON выполнится, все функции DEFUN зани-
мают новый участок node памяти, называемый таблица страниц (page table),
в начале каждого списка функции. Этот node участок добавляется перед
списком, содержащим формальные аргументы. Участок памяти page table node
используется исключительно,как перелистыватель страниц ,и в любом случае,
им нельзя манипулировать пользователю программ. Функция TYPE возвращает
PAGETB в эти участки памяти node.
Когда программа AutoLISP загружается из участка памяти node, ме-
ньше всего используемая функция сбрасывается записью ее в стра-
ничный файл (paging file) , сохраняя адрес страничного файла в таблице
страниц, и освобождая весь участок памяти node, занимаемый функцией,
следующей за таблицей страниц. В таблице страниц маркируется та функция,
которая сброшена. Когда сброшенная функция вычислена, она снова считыва-
ется из страничного файла( возможно откачивание других функций) по при-
оритету выполнения. Когда функция списана из страничного файла,
последующие откачки просто освобождают этот участок hode памяти. Нет
необходимости удалять функцию , так как она всегда присутствует в файле.
В AutoLISPе функции, созданные с помощью DEFUN, являются просто
списками, и ими можно манипулировать как со списками. Программы , которые
делают это , должны быть осведомлены об операции перелистывания страниц
( или не применяйте VMON). Прежде всего,функции, создаваемые с помощью
функции DEFUN, имеют в начале участок памяти node таблицы страниц ( page
table), так что , вы должны перескочить его, если будете сканировать фу-
нкцию. Если вы создаете функцию сами для себя , как список( обходя
DEFUN), она будет работать прекрасно,но она не подойдет для свопинга
( перекачивания) , поэтому вы можете легко запустить ее из памяти,
если вам это удобнее. Наоборот, вы можете поместить функцию
в память , переопределяя ее без таблицы страниц. Например, чтобы помес-
тить функцию, определенную DEFUNом с именем ZORP,в память,вы должны ис-
пользовать:
(setq zorp (cdr zorp))
чтобы удалить применение таблицы страниц. Таблицы страниц печатаются про-
сто как пробел , когда вы используете функцию PRINT. Вы можете определить,
когда функция перекачиваема, проверив, имеется ли пробел после первой
левой скобки: если так , она перекачиваема.
Если вы пытаетесь сканировать функцию, как данные, и откачи-
вать ее, вы должны найти только таблицу страниц в списке функции. Проход-
- 90 -
Руководство пользователя по АВТОЛИСПу
ная функция не будет перекачена- только вычисливши ее, можно сделать это.
Итак, если вы создаете функции и модифицируете их с хитростью, организуй-
те их как списки , вместо использования функции DEFUN, или используйте
трюк,приведенный выше, чтобы поместить их в память.
Список символов, известных AutoLISPу, называется ATOMLIST. Есть
возможность хитрой программе манипулировать этим списком, чтобы исправить
пробел или сканировать все символы. ( Как отмечено в предыдущей главе,
это не стандартная особенность LISPа, и она может быть изменена в буду-
щих версиях AutoLISPа.) Когда функция откачивается , она преобра-
зуется в пути , это предполагает что ATOMLIST, не будет изменен до тех
пор, пока функция не откачается ( если разбиения памяти на страницы нет
на этом пути, функция занимает гораздо больше места на диске и идет в
пять раз медленней). Чтобы быть уверенным , что ATOMLIST не изменится,
когда листание действительно имеется, доступ к ATOMLISTу блокируется
перемещением ATOMLISTа из списка символов ,доступнх пользователю. Если
вы используете виртуальную функцию листания страниц, оставьте ATOMLIST
в покое.
Если вы действительно хотите , чтобы у вас были неприятности,
вы можете это сделать. Вы можете создать свою собственную функцию,
включая таблицу страниц, из любой другой функции. Вы должны присвоить
ATOMLISTу собственную переменную и изменить ее после того , как AutoLISP
стартует для листания страниц. Вы можете даже придумать что-нибудь бо-
лее творческое и ужасное. Однако , такое поведение может быть отмщено
разрушением вашей программы; это не может повредить AutoLISPу или Auto-
CADу. Итак, если вы хотите нести потери, вперед.
Глава 7
СООБЩЕНИЯ ОБ ОШИБКАХ
Ниже приведен список сообщений об ошибках, которые вы время от
времени увидите, когда вы пишете или выводите функции AutoLISPа. Если
функция "ERROR" определена не пользователем ("ERROR" связана с nil),
ошибка является стандартной акцией , тогда эти сообщения выводятся
на экран дисплея в виде:
error: message
ошибка:сообщение
следом за прослеженнй функцией. Если существует пользователь-определитель
функции "ERROR", эта функция , называемая сообщением, пройдет только в
качестве аргумента.
Функции, отклоняемые AutoCADом
Аргументы проходящих в AutoCAD функций недействительны ( таких,
как функции GETVAR "NOSUCH" или SETVAR с только читаемыми
системными переменными), или функция, переходящая сама в себя,
недействительна в текущем контексте.
- 91 -
Руководство пользователя по АВТОЛИСПу
|