Лабораторная работа №4. Тема: Основы программирования в среде Visual LISP. Типы данных. Этапы разработки программ. Их применение. Цель: Понять принципы и базовые приемы программирования на языке AutoLISP; знать очередность и содержание основных этапов разработки программного обеспечения в AutoLISP. Ход работы. 1. Запустить AutoCAD одним из возможных способов. Загрузить Visual LISP. 2. Ознакомиться с основными концепциями программирования в AutoLISP. 2.1. Основные понятия и определения. AutoLISP — один из диалектов языка программирования высокого уровня COMMON LISP (1986). LISP был создан как язык функционального программирования и относится к языкам декларативного типа. На схеме (Рис.1) представлена классификация языков средств, но она условна, поскольку почти каждый язык содержит те или иные элементы другого языка. Со временем языки взаимно дополняют и обогащают друг друга. Рис. 1. Классификация языков программирования Название языка LISP происходит от начальных букв двух слов LISting Processing (Обработка списков). 2.2. Типы данных AutoLISP Приведем краткое описание основных объектов. • Список — это упорядоченная, заключенная в круглые скобки последовательность, элементами которой могут быть: числовые константы (числа целые и вещественные); текстовые константы; логические (Т — истина, NIL — ложь); идентификаторы (имена переменной, функции, аргумента); список. Список можно записывать с апострофом перед открывающей круглой скобкой. Например: ‘(15 12,14 «Текстовая константа» ‘(А В С) PI), что позволит блокировать проведение вычислений внутри него. Таким образом, список в общем виде — это многоуровневая, иерархическая структура данных, в которой открывающие и закрывающие круглые скобки находятся в строгом соответствии (парности). Список, в котором нет ни одного элемента, называется пустым и обозначается ‘() или именем NIL. Список в AutoLISP заключается в круглые скобки, а элементы списка разделяются пробелами. Примечание! Частным случаем списка является точечная пара, т.е. такой список, элементы которого отделяются не пробелами, а точкой. Они находят применение для описаний свойств графических примитивов (код и значение, соответствующее коду, разделяются точкой). Это обеспечивает более компактный вариант хранения данных в памяти. • Выражение — это список, в котором первым элементом является имя функции. Любая функция AutoLISP состоит из выражений и сама является выражением. Выражение в AutoLISP имеет вид: (<имя функции> [<аргумент1>] [< аргумент2>] [<>]…) Квадратные скобки означают, что элемент может быть в списке, а может и не быть. • Аргументы (параметры) — это средство передачи значений (данных) в функцию. Аргументами могут быть переменные, константы (числовые, текстовые, логические) или выражения. Число аргументов функции может быть переменным, фиксированным или нулевым. • Переменные — это элементы языка AutoLISP, предназначенные для представления различных элементов языка AutoLISP и не имеющие постоянного значения. • Константы — это элементы языка AutoLISP, предназначенные для представления самих себя, имеющие постоянные значения. Константы языка AutoLISP могут быть трех видов: числовые (целые и вещественные); текстовые (строковые) и логические. • Числовые константы — это любая последовательность цифр со знаком или без знака, отделяемая или неотделяемая точкой. Знак точки не должен стоять в начале и в конце числа. Целые числа в AutoLISP представляются 32 двоичными разрядами со знаком, и их значения могут находиться в пределах -2147483648… +2147483648. Однако между AutoLISP и AutoCAD передаются только 16-разрядные числа (то есть значения в пределах -32768… +32767). При использовании значений, выходящих за эти пределы, необходимо использовать функцию (FLOAT…) для преобразования целого числа в вещественное. Вещественные числа в AutoLISP представляются, как числа с плавающей точкой с двойной точностью, при этом обеспечивается не менеее 14 знаков точности. Вещественные числа передаются как значения с 32 двоичными разрядами. Числа между -1 и 1 должны явно содержать нулевую целую часть. Точно так же надо писать, например, 23.0, а не 23. • Текстовые константы — это любая последовательность знаков и пробелов, взятых в кавычки. • Логические константы — это Т (True — истина), Nil — ложь. • Символы (идентификаторы) — это имя (имена переменной, функции, аргумента), состоящее из прописных или строчных букв, цифр и знаков за исключением () — круглых скобок, . — точки, ‘ — апострофа, » — кавычек, ; -точки с запятой. Изначально у символов нет никакого значения. В интерпретаторе прописные и строчные буквы отождествляются и представляются прописными. Форма представления программы и обрабатываемых данных в AutoLISP одна и та же — список. В зависимости от контекста запись вида (- 10 7) в AutoLISP может интерпретироваться двояко. Это может быть список, обеспечивающий вычисление. Первый элемент списка — имя функции, два остальных — ее аргументы. В результате получаем значение вычитания, равное 10 — 7, то есть 3. Но это может быть и список, состоящий из трех элементов (символов: -, 10 и 7). Списками удобно представлять алгебраические выражения, графы, геометрические объекты, правила вывода и многие другие сложные объекты. Кроме того, они хорошо компонуются в памяти современных ЭВМ. 3. Функции AutoLISP. 3.1. Операции над данными языка. Действие функции. Единственный вид операций над данными в AutoLISP — это вычисление функций. Перед вычислением все переменные, аргументы и вызовы функций заменяются на свои значения. Чтобы обойти обязательное вычисление функций или блокировать их вычисление, используется функция (QUOTE…) или ее эквивалент в виде апострофа ‘. Например, запись (QUOTE (* 5 6)) ИЛИ ‘(* 5 6) даст одно и то же значение (* 5 6) — список. Примечание! Как можно заметить, операция умножения не выполняется. Чтобы снять блокировку, используется функция (EVAL…); например, запись (EVAL (QUOTE (* 5 6))) ИЛИ (EVAL ‘ (* 5 6)) даст одно и то же значение 30 — результат умножения чисел 5 и 6. Функция (EVAL…) обеспечивает снятие блокировки и выполняет операцию вычисления, например, функции умножения. Все эти функции — встроенные функции языка AutoLISP. Здесь функция (EVAL…) присутствует явно, однако при вычислении функций, не блокированных функцией (QUOTE…), нет ее явного присутствия, поэтому писать ее не надо. По существу, функция (EVAL…) — это интерпретатор языка AutoLISP (Evaluate — вычислить). Работа языка AutoLISP состоит в чтении входного выражения (списка), вычислении этого выражения с помощью функции EVAL (она присутствует, как правило, неявно) и выводе полученного результата — значения функции. При этой схеме работы не происходит перевода программы в машинный код. Такой режим работы называется интерпретирующим, а функция (EVAL…) — интерпретатором. Значением переменной в LISP может быть объект любого типа (число, символ, список, имя переменной, функции, …) без предварительного его описания, что недопустимо в процедурных языках программирования. Современные LISP-системы, включая AutoLISP, обладают мощными средствами, необходимыми для эффективного решения численных задач. Известно, что одна из целей COMMON LISP заключалась в том, чтобы стать гибкой и эффективной альтернативой Фортрану в области численного научно-технического программирования. В языке AutoLISP свыше 200 встроенных функций, каждая из которых выполняет определенную операцию. LISP является языком прикладного и системного программирования высокого уровня одновременно. Машинный язык он напоминает тем, что и данные, и программы представлены в нем в одинаковой форме. В AutoLISP можно выделить три вида функций: встроенные в язык, разработанные и описанные пользователем, а также функции, разработанные и описанные другими пользователями. 3.2. Создание новой функции. Для создания новых функций в AutoLISP имеется специальная функция (DEFUN…). При разработке функций в AutoLISP широко используется мощный метод рекурсии, то есть при определении функции эта функция может вызывать саму себя. Рассмотрим этот метод на примере вычисления показательной функции с целым положительным коэффициентом. Показательную функцию можно представить как функцию двух аргументов: Y(A, N) = AN. Эту же функцию можно представить и в другом виде: Y(A, N) = А * Y(A, N-1) = А * A^1 = AN. В языке AutoLISP эту функцию можно определить с помощью встроенной функции под именем DEFUN (DEfmition FUNction — определение функции) с использованием рекурсии: (DEFUN РОС (A N) ; определение показательной функции (IF (= N 1) А (* А (РОС А (- N 1)))) ) В результате выполнения функции (DEFUN…) появится имя РОС. Это означает, что создана и описана новая функция, которая может быть использована для вычислений. Например, запись (РОС 5 4) тут же даст результат вычисления: 625 -возведение числа 5 в четвертую степень. При создании пользовательской функции после имени функции DEFUN следует имя функции, которое задает сам пользователь (в нашем примере РОС), затем в круглых скобках через пробел указываются аргументы. Далее описывается алгоритм вычисления функции: если N = 1, то результат выполнения функции равен А, иначе произведению А на AN-1. Здесь следует обратить особое внимание на форму записи функции при ее определении. Имя функции пишется в инфиксной форме (сначала имя функции, а затем в круглых скобках аргументы). При использовании функции для вычислений она пишется в префиксной форме. Имя функции и аргументы заключены в круглые скобки. Функция должна описываться до начала использования. Обращение к описанной функции может быть помещено в любом месте программы, оно может стоять даже на месте аргумента другой функции. При вызове функции интерпретатор обратится к описанию, произведет вычисление согласно описанию и тут же выдаст результат или будет использовать его для дальнейших вычислений. Обращение после описания нашей функции даст следующий результат: (РОС 5 (+ 1 3)) 625 Для облегчения понимания описание функций на AutoLISP лучше делать с отступами, а также снабжать необходимыми комментариями, которые записываются после ; (точки с запятой). (DEFUN РОС (A N) ; показательная функция с положительным (IF (= N 1) А ; показателем степени (* А (РОС А (- N 1)))) ) (РОС 5 4) ; вызов функции после ее описания Функцию (DEFUN…) можно использовать для описания самых разнообразных функций, например, функции, которая будет брать производную от алгебраического выражения; искать и исправлять в тексте ошибки; рисовать на экране многоступенчатый объект с заданными параметрами; чертить узел машины… В настоящее время созданы LISP-системы и даже LISP-машины, которые содержат тысячи подобных функций, обеспечивающих эффективное решение многочисленных самых разнообразных задач, включая задачи искусственного интеллекта. 4. Основные этапы программирования на AutoLISP AutoLISP хорошо сочетается с прикладной графикой, он очень прост в изучении и универсален в применении. Язык имеет много встроенных функций, отражающих специфику графического редактора AutoCAD. AutoLISP обеспечивает возможность формирования чертежа за считанные минуты. Чтобы получить чертеж, необходимо предварительно написать программу для его создания. Для упрощения процесса нужно иметь соответствующий банк программ графических чертежей. Написание программы на AutoLISP требует выполнения ряда основных действий: четкой формулировки (постановки) задачи; выявления основных особенностей, взаимосвязей и количественных закономерностей; формирование графического изображения объекта; разработки программы (функций) на AutoLISP; реализации программы на ЭВМ. Каждый из этих этапов рассмотрим подробнее. Постановка задачи. На этом этапе определяется: графический объект (план офиса, коттедж, многоступенчатый объект и т. д.), который может формироваться программой при различной входной информации (например, число ступеней объекта, размеры каждой ступени, текстовые пояснения, необходимость указания размеров, местоположение объекта на чертеже и т. д.). Выявление основных особенностей, взаимосвязей и количественных закономерностей. На этом этапе устанавливаются взаимосвязи отдельных элементов чертежа с точки зрения эффективного их построения, например, взаимосвязь между смежными ступенями объекта: диаметр последующей ступени объекта может быть меньше или больше диаметра предыдущей и т. д. Одновременно определяются способы построения отдельных элементов графического объекта и условия, которые влияют на выбор способа построения элемента. Проводится декомпозиция сложного графического объекта на ряд элементарных, описание которых может быть выполнено простыми встроенными функциями. Определяются постоянные и переменные параметры, текстовые вставки, формируются запросы и сообщения, программно выдаваемые конструктору и т.д. Разработка последовательности действий создания графического изображения объекта. На этом этапе подробно излагаются все действия, связанные с построением графического изображения объекта, возможно использование циклических процедур. Указывается, какая входная информация необходима, как она используется для формирования изображения того или иного элемента объекта. Разработка программы (функций) AutoLISP. B языке функционального программирования каждое действие, каждая операция описываются некоторой функцией или комбинацией функций, встроенных или построенных пользователями. Каждая функция имеет свое оригинальное имя, она может иметь один или несколько аргументов либо не иметь их. Аргументы функции могут быть тоже функциями. В AutoLISP используется несколько необычная форма записи функции — префиксная. Все функции, встроенные и разработанные пользователями, имеют префиксную форму записи. • Префиксная форма записи функции — это такой вид записи, в которой имя функции вместе с аргументами функции заключаются в круглые скобки. Наиболее привычной является инфиксная форма записи функции. • Инфиксная форма записи функции — это такой вид записи, при которой сначала пишется имя функции, а в скобках указываются ее аргументы. Ниже, в общем виде, приведены разные формы записи: F (Xl,X2,…) — инфиксная форма записи функции; (F XI X2…) — префиксная форма записи функции, где F — имя функции; X1, X2 — аргументы функции. В качестве аргумента функции в AutoLISP может быть функция, переменная, константа и т. д. Имя функции может состоять из одного или нескольких символов. Например, запись (+ 5 4) означает, что функция имеет имя +( сложение) и два аргумента: числа 5 и 4. В результате выполнения функции получим число 9. Функция вычитания имеет имя — ; функции деления — /, умножения — *; возведение в степень — EXPT; определение модуля числа — ABS; синус — SIN; косинус — СОS; арктангенс — ATAN; квадратный корень — SQRT; экспонента — EXP; натуральный логарифм — LOG. Выполнение программы на AutoLISP. Рассмотрим основные способы выполнения программы на AutoLISP: • ввод программы с клавиатуры в командной строке системы AutoCAD. В ответ на приглашение Command: можно вводить функции AutoLISP. После ввода функции в командной строке нажмите клавишу Enter (Ввод) для выполнения функций и просмотра результатов. Например: Command: (+ (* 5 6 7) (COS 0.5)) ; нажмите клавишу Enter 210.878 ; результат, выводимый на экран Command: (COMMAND «LINE» «5,10» «30,40» «»;построение отрезка «ZOOM» «ALL» «») ;увеличение изображения На графическом поле рабочего стола AutoCAD появится изображение линии, проведенной из точки с координатами (5,10) в точку с координатами (30,40). Этот способ не предусматривает сохранения введенных выражений; • ввод программы, оформленной как описание функции с клавиатуры, в командной строке системы AutoCAD. Если программа оформлена как одно или несколько описаний функций, то есть начинается с имени DEFUN, то к этой функции можно обращаться в любой момент до завершения текущего сеанса работы с AutoCAD, после чего программа должна быть набрана снова. Например, определим функцию, которая будет вычислять тангенс угла: Command: (DEFUN TTANG (X) (IF (AND (/= X (* PI 0.5)) (/=X(* PI 1.5))) (/ (SINX) (COSX)) «Бесконечность»)) TTANG ; определение функции TTANG; далее задание условия объединения выражений ;(неравенство аргумента числам PI и 1.5 PI), иначе результат равен “бесконечности” ; (деление 1 на 0) для вычисления функции TTANG Command: (TTANG 0.5) ;выполение функции с аргументом 0.5 радиан 0.546302 ;результат работы, выводимый на экране Command: (TTANG (* PI 1.5)) «Бесконечность» Если синтаксис при определении функции не нарушен, то после нажатия клавиши Enter на следующей строчке появится имя новой определенной функции, которой можно пользоваться для расчетов; • запись программы в файле и ее вызов в командной строке системы AutoCAD. Программа создается с помощью любого редактора текстов и сохраняется в файле с расширением LSP, например, DOM.LSP. Для выполнения программы ее необходимо загрузить, используя функцию AutoLISP (LOAD…). Например: Command: (LOAD «C:/ALISP/DOM») Имя файла при этом задается в текстовом виде без расширения с указанием пути. Если загрузка завершена успешно, функция (LOAD…) возвращает имя последней функции, определенной в файле, если нет — имя файла (LOAD «<имя файла>»); • ввод программы, оформленной как описание функции с начальными символами С: с клавиатуры в командной строке системы AutoCAD. Если программа может быть оформлена как описание функции без аргументов, то есть начинается с имени DEFUN, а собственное имя функции имеет начальные символы C:, то к этой функции можно обращаться без круглых скобок в любой момент до завершения текущего сеанса работы с AutoCAD, после чего программа должна быть набрана снова; • автоматическая загрузка программы. Если программа оформлена как описание функции без аргументов, т.е. начинается с имени DEFUN, а собственное имя функции имеет начальные символы С: и она загружена в файл ACAD.LSP, то такой файл автоматически загружается при запуске AutoCAD. Файл ACAD.LSP обычно содержит наиболее часто используемые функции. Такие функции вызываются на выполнение как команды AutoCAD без круглых скобок; • ввод программы из окна текстового редактора Visual LISP. Когда программа находится в активном окне текстового редактора, щелкните по кнопке Load activate edit window (Загрузка активизированного окна редактирования) или выберите пункт Load Text in Editor (Загрузить текст из окна редактирования) из падающего меню Tools (Инструменты) главного меню Visual LISP. Как только на экране появится сообщение о загрузке программы в окне консоли Visual LISP, произведите обращение к функции и для ее выполнения нажмите клавишу Enter; • ввод программы из окна консоли Visual LISP. После введения программы в окне консоли нажмите клавишу Enter для ее выполнения. Программа на AutoLISP может обрабатывать данные из файлов, которые необходимо предварительно открыть с помощью функции (OPEN…). После работы все открытые файлы необходимо обязательно закрыть, используя функцию (CLOSE…). Функция (OPEN…) часто используется в сочетании с функцией (SETQ…), что упрощает операцию ввода-вывода. Например, следующая запись: (SETQ F1 (OPEN «C:/KUDR/VAL.DAT» «r» )) означает, что на диске С: в каталоге KUDR производится поиск файла с именем VAL.DAT, который открывается для чтения «r» (read — чтение). Использование функции (SETQ…) упрощает операцию закрытия открытого файла, которая при этом выглядит следующим образом: (CLOSE F1) Кроме символа «r» (чтение), можно использовать символ «w» (write — запись), который означает, что файл данных открывается для записи. Если файл с таким именем уже существует, данные будут перезаписаны. Использование символа «a» (add — добавить) означает открытие файла данных для пополнения его новыми сведениями. Если такого файла нет, он создается. Примечание! Следует обратить особое внимание на необычную запись местонахождения файла. В ней используется символ / (прямая косая черта) вместо символа \ (обратной косой черты), если следовать правилам операционной системы MS DOS. Это вызвано тем, что символ \ в AutoLISP используется для ввода управляющих символов: \n — перевод строки; \r — возврат каретки; \t — табуляция. В то же время можно использовать и обратную косую черту \, но в следующей записи: \\. И тогда открытие файла можно записать так: (SETQ F1 (OPEN «C:\\KUDR\\VAL.DAT» «r» )) Для вывода на экран значения, на которое ссылается символ, необходимо набрать восклицательный знак и символ: ! <символ>. Ввод в командной строке AutoCAD круглой открывающей скобки (означает подключение интерпретатора AutoLISP для обработки вводимого выражения. Количество круглых открывающих скобок в выражении, записанном на языке AutoLISP, должно точно соответствовать числу круглых закрывающих скобок. Последняя парная закрывающая скобка означает конец ввода выражения на языке AutoLISP и переход интерпретатора AutoLISP в режим вычисления (обработки) выражения. Если введенное выражение полностью соответствует синтаксису языка AutoLISP, то ниже появляется результат вычисления. Допустим, необходимо произвести сложение числа 5.34 с вещественным числом, которое вводится с клавиатуры. Это выражение можно записать в командной строке следующим образом: (+ 5.34 (GETREAL «ВВЕДИТЕ ЧИСЛО N = «)) После нажатия клавиши Enter на экране появится предложение в виде: ВВЕДИТЕ ЧИСЛО N = Введем, например, число 15.06. На следующей строчке будет показан результат вычисления: 20.4 Предположим, в выражение вкралась ошибка: пропущены вторые двойные кавычки в строковой константе в подсказке. Выражение будет выглядеть так: (+ 5.34 (GETREAL «ВВЕДИТЕ ЧИСЛО N = ) ) В этом случае после ввода выражения появится сообщение: 2> Такое состояние позволяет продолжить ввод выражения AutoLISP. Данное сообщение связано с тем, что все символы после первой открывающей кавычки воспринимаются как строка символов. Чтобы продолжить вычисления, необходимо в строке, где появилось сообщение 2>, закрыть строковую константу второй двойной кавычкой и ввести две закрывающие скобки. Строка будет выглядеть следующим образом: 2> «)) После нажатия клавиши Enter появится запрос: ВВЕДИТЕ ЧИСЛО N = )) Необходимо ввести число, например, 15.06. ВВЕДИТЕ ЧИСЛО N = )) 15.06 20.4 Отказаться от неверно набранного выражения можно, если нажать комбинацию клавиш Ctrl+C и правильно набрать выражение. Допустим, в выражении, приведенном выше, сделана ошибка — пропущена вторая закрывающая скобка: ( + 5,34 (GETREAL «ВВЕДИТЕ ЧИСЛО N = «) В этом случае после ввода выражения появится сообщение: 1> Это означает, что в выражении пропущена одна закрывающая скобка. Чтобы продолжить вычисления, необходимо в строке, где появилось сообщение 1>, ввести одну закрывающую скобку. Строка будет выглядеть так: 1> ) После нажатия клавиши Enter появится запрос: ВВЕДИТЕ ЧИСЛО N = Введем, например, число 15.06: ВВЕДИТЕ ЧИСЛО N = 15.06 20.4 Отказаться от неверно набранного выражения также можно, если нажать комбинацию клавиш Ctrl+C и правильно набрать выражение. Примечание! Самое трудное в AutoLISP — отслеживать соответствие открывающих и закрывающих круглых скобок и кавычек для строковых констант. Чтобы облегчить этот процесс при написании программ на AutoLISP, целесообразно использовать текстовые редакторы, которые могут следить за тем, чтобы количество открывающих скобок соответствовало количеству закрывающих. Такими возможностями обладает, например, текстовый редактор NORTON Editor фирмы SYMANTEC. Ho лучше всего использовать современную интегрированную среду Visual LISP для системы AutoCAD 14, 2000 версий. Практическое задание. 1. Изучить действие рассмотренных в работе функций на аналогичных примерах с другими параметрами. 2. Создать программу по заданию, установленному индивидуально преподавателем.
Основы программирования в среде Visual LISP.
19 Фев, 2009