Что возвращает функция chr() в таком примере (chr (- 65 1))? |
Программирование на языке AutoLISP
Списки - это основные структуры данных, используемые в процедурах на языке AutoLISP. В программе AutoCAD данные об объекте формируются в виде списка, который содержит списки меньшего размера.
В AutoLISP список заключается в круглые скобки. Нумерация элементов в списке начинается с нуля. Примером списка является задание координат точки в прямоугольной системе координат X,Y,Z: (1.2 3.4 5.6) .
Стандартной операцией во всех языках является извлечение из списка одного или нескольких элементов. Основные функции AutoLISP извлечения из списка приведены в таблице:
Функция | Результат | Описание |
---|---|---|
CAR | 1.2 | Возвращает первый элемент списка |
CDR | (3.4 5.6) | Возвращает все элементы списка, кроме первого |
CADR | 3.4 | Возвращает второй элемент списка |
CADDR | 5.6 | Возвращает третий элемент списка |
NTH | Возвращает произвольный элемент списка |
Функции NTH нужно задать два параметра: номер элемента и имя списка. Список создается функцией LIST. Если элементы списка являются константами, а не переменными, то для его создания можно использовать функцию QUOTE. Вместо имени QUOTE часто ставят одинарную кавычку. Функции для работы со списками описаны в разделе AutoLISP Developer's Guide - Appendixes - Basic Functions - List Manipulation Functions справочной системы AutoCAD.
Пример
(defun c:funlist (/ corner) (setq corner (list 1.2 3.4 5.6)) (nth 0 corner) )
При запуске этой процедуры функция возвращает значение нулевого члена списка.
Оформление процедуры
При создании процедуры особое внимание следует обращать на обработку ошибок и комментарии. Например, в предыдущем задании требовалось выделить текстовый объект. Если пользователь выделил не текст, то должно быть выдано сообщение: "Выделите текст". Чаще всего такие проверки осуществляют с помощью оператора IF. Для выполнения оператора IF требуется проверка логического выражения на истинность. Если пользователь не выделит объект нужного типа, то логическое выражение примет значение nil. В эту часть условного оператора и нужно поместить сообщение об ошибке.
Процедура должна начинаться с заголовка-комментария. Здесь должно быть описание функционального назначения процедуры, дата составления, особенности применения. Это поможет другим пользователям Вашей процедуры сразу оценить возможности ее применения в своих задачах. Кроме того, как правило, через несколько месяцев и составителю трудно вспомнить все те мелкие задачи, на которые сегодня потрачено немало труда. Поэтому комментарии желательно помещать и в тело процедуры. Не надо жалеть времени на комментарии.
Среда AutoLISP поддерживает несколько типов комментариев, различающихся по их выравниванию относительно левого края рабочей области.
;;; - три точки с запятой. Такой комментарий выравнивается по левому краю. Он используется в начале процедуры для описания ее назначения и функционирования.
;; - две точки с запятой. Этот комментарий сдвигается в процессе форматирования на уровень следующих скобок. Такой тип комментариев используется для пояснения следующих за ним одной или нескольких строк кода.
; - точка с запятой. Комментарий, помеченный таким символом, сдвигается вправо на 40 символов. Это значение можно изменить в диалоговом окне Format options, открываемом по команде Tools - Environment Options -Visual LISP Format Options. Данный тип комментария обычно используется для текущих пояснений в правой части кода. Записи хорошо выделяются на фоне кода.
;| |; - внутренний комментарий. Его можно поместить внутри любой строки кода. Текст комментария ограничивается точкой с запятой и вертикальной чертой.
;_ - комментарий в конце строки. Используется в конце любой строки. Чаще всего в нем объясняют, какой оператор закрывает данная скобка. Это особенно касается условных операторов, когда закрывающая скобка расположена через несколько строк после открывающей скобки.
Отладка кода
Специальное окно Visual LISP Console заменяет пользователю в среде Visual LISP командную строку системы AutoCAD. С консоли вводят выражения на языке AutoLISP, загружают и выполняют функции. На консоль выводятся сообщения Visual LISP и AutoCAD.
В окне консоли в качестве приглашения пользователя к вводу информации применяются символы "_$". Например, если пользователь загрузил файл val.lsp с одноименной функцией, то для выполнения программы нужно набрать в консоли (с:val) . Visual LISP выполнит программу и выведет результат на консоль.
С консоли можно читать значения глобальных переменных. Для этого нужно в ответ на приглашение ввести в строке консоли имя переменной. Visual LISP выведет ее текущее значение. Другой способ узнать значение переменной - двойным щелчком выделить ее в тексте программы и нажать кнопку "Load Selection".
При отладке программы удобно следить за значениями выбранных глобальных переменных. Для этого используются пункты Inspect, Symbol Service, Watch Window. Вызов соответствующих диалоговых окон показывает текущие значения выбранных переменных или выражений.
Особенно часто встречаются ошибки в типах аргументов, передаваемых функциям. Такие сообщения выводятся в окно консоли, а при работе в окне AutoCAD - в командной строке. Все сообщения о неправильности типа аргумента выглядят следующим образом:
Bad argument type: (ключевое слово - нужный тип): фактическое значение. В таблице приведен список ключевых слов и соответствующих им типов данных.
Отладка (debugging) является необходимым этапом создания программы. В процессе отладки нужно найти и устранить ошибки. Visual LISP предоставляет свои средства отладки.
Для начала загрузите функцию, заведомо содержащую ошибку. Введите ее в редактор Visual LISP и загрузите.
;;;При попытке выполнения этой функции возникает ошибка, так как функция ;;;strcat предназначена для объединения строк (defun Error-Prone-Code () (strcat ""Эта функция никогда не напечатает число:" 1) )
Выберите команду Debug - Break on Error - тогда редактор автоматически перейдет к строке кода с ошибкой.
Проверим работу отладчика. Введите в окне Console выражение (Error-Prone-Code) ↵ Visual LISP возвратит сообщение об ошибке: ; error: bad argument type: stringp 1
Получив сообщение, щелкните на кнопке Last Break (последнее прерывание). Вы перейдете в строку кода, которая содержит ошибку.
Задание 4.6
В новом чертеже в редакторе Visual LISP введите следующий код:
;;;Функция add-3-numbers выполняется правильно только в том случае, ;;;когда все три ее параметра являются числами (defun add-3-numbers (num1 num2 num3) (+ num1 num2 num3) )
Загрузите содержимое активного окна.
В окне Console введите (add-3-numbers 1 2 3) ↵ Среда вернет 6.
В окне Console введите (add-3-numbers 1 "a" 3) ↵ Среда вернет сообщение об ошибке: error: bad argument type: numberp: "a" .
Выберите команду Debug - Break on Error.
Щелкните на кнопке Last Break панели инструментов Debug. Вы автоматически перейдете в строку, где найдена ошибка. Чтобы продолжить работу в режиме Break on Error щелкните на кнопке Reset панели инструментов Debug.
Иногда в режиме Last Break выделенной оказывается слишком большая часть кода, что затрудняет поиск ошибки. В этом случае всю программу разделяют на небольшие фрагменты точками прерывания. В этих точках приостанавливается выполнение программы - AutoLISP ожидает дальнейших инструкций от пользователя.
Чтобы установить точку прерывания, установите курсор справа от закрывающей скобки и нажмите клавишу F9. Строка будет отмечена красной меткой. После разметки необходимо повторно загрузить код, чтобы сообщить Visual LISP об их появлении. Код программы будет выполняться до первой точки прерывания.
При разметке программы становятся доступны кнопки панели Debug. Три первые кнопки этой панели предоставляют три разных способа перемещения в пределах кода:
- STEP INTO - вход внутрь выражения начиная со скобок самого глубокого уровня вложенности.
- STEP OVER - переход к следующей строке кода, не углубляясь во вложенные выражения.
- STEP OUT - переход к концу функции, можно без остановки пройти всю функцию.
Чтобы удалить точки прерывания, выберите команду Debug - Breakpoints Window. Активизируется диалоговое окно для просмотра и удаления точек прерывания.
Упражнения
- В задании 3.4 составлен файл инициализации, выводящий на экран приветствие при открытии чертежа. Дополните процедуру операциями, которые удаляют приветствие с экрана.
- Системная переменная ISOLINES определяет число изолиний, которые используются для построения объемных тел. Создайте процедуру построения сферы. С помощью оператора SETVAR задайте число линий равным 0 или 64. Сравните вид сферы в режимах 2DWireframe и Realistic.
- Наберите в новом файле следующий код:
;;; to the console in a more human readable format. (defun Vertlist (aList) ;; this will print every item in the list (princ (chr 40)) ; an opening parenthesis (princ (car aList)) ; the first item in the list (foreach item (cdr aList) ; the rest of the list except the beginning (terpri) ; place a new line (princ " ") ; print a space (princ item 1) ; and print the item in the list ) (terpri) (princ (chr 41)) ; closing parenthesis (terpri) ; a new line T ; returns T )
Эта процедура создает вертикальный список чисел. Функция Foreach осуществляет переход от одного элемента списка к другому.
Выберите команду Debug - Break on Error. Введите в окне Console следующую строку:
(Vertlist '(1 2 3 4 5))
Интерпретатор возвратит Вам сообщение об ошибке. Щелкните по кнопке Last Break, чтобы перейти к строке кода, содержащей ошибку.
Ключевые термины
Переменные - символьные имена, которыми можно оперировать в программе.
Системные переменные- параметр AutoCAD, который служит для настройки режима работы с чертежом.
Файлы инициализации - lsp-функции в файлах acad.lsp и acaddoc.lsp.
Списки - набор чисел, литералов и точечных пар.
Консоль - специальное окно отладки в среде Visual LISP.
Краткие итоги
Процедура представляет собой команды для выполнения чертежных операций. Составление и отладка процедуры производятся в среде Visual Lisp. Структурными единицами процедуры являются функции, переменные и константы. Отладку процедуры удобно проводить в консоли среды Visual LISP.
Вопросы
- Что такое локальная и глобальная переменные?
- Что такое системная переменная?
- Какие три типа функций можно различить при их определении?
- Перечислите функции для выполнения стандартных операций со списками.
- Как форматируются разные типы комментариев?
- Какие средства отладки программ предусмотрены в среде Visual LISP?