Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Лекция 11. Типы данных и основы языка Lisp
Язык программирования AutoLISP— это вариант языка LISP, в который добавлены функции доступа к объектам, таблицам и словарям системы AutoCAD. Основой языка LISP является работа со списками, которые могут иметь произвольную длину и включать элементы разной природы (числа, текстовые строки, указатели файлов и т. д.). В то же время в языке доступны обычные арифметические вычисления, логические операции, работа с файлами и т. д. С помощью языка AutoLISP можно писать программы или вводить в командной строке выражения, которые затем вычисляет система AutoCAD. Для чтения и разбора выражений в систему AutoCAD встроен интерпретатор AutoLISP. За последние годы язык развился за счет новых функций с префиксом vi-, а также функций, предоставляющих доступ к объектной модели AutoCAD и реализующих элементы технологии ActiveX. Такие функции (довольно условно) отнесены к языку Visual LISP. Для простоты объединение языков AutoLISP и Visual LISP будем называть просто LISP. Форма вычисляемых выражений языка AutoLISP: (< функция> [< аргумент1> [< аргумент2>... [< аргументы> ]...]]) Здесь < функция> — это ИМЯ функции, < аргумент1>, < аргумент2>, < аргументы> — аргументы функции, разделяемые, по крайней мере, одним пробелом С точки зрения LISP все, что заключено в круглых скобках, является списком, который следует обработать как вычисляемое выражение. Квадратные скобки в приведенной форме указывают на возможное отсутствие находящихся между ними аргументов. Количество аргументов зависит от синтаксиса функции. Существуют функции, которые вызываются без аргументов. Основное правило AutoLISP— баланс скобок, т.е. количество открывающих скобок должно быть равно количеству закрывающих.
Функция setq и точность отображения
Интерпретатор LISP вычисляет значение каждого введенного выражения и возвращает его в среду AutoCAD. Возвращаемое значение, в свою очередь, либо может быть передано для дальнейших вычислений в выражение более высокого уровня, либо может быть сохранено в переменной (человеку, знакомому с программированием, ясно, что это— именованные участки памяти для хранения данных) с помощью функции присвоения setq, имеющей следующий синтаксис: (setq < переменная1> < выражение1> [< переменная2> < выраженле2>... [< переменнаN> < выражениеN> ]... ] } Функция setq может использоваться с любым количеством аргументов, которое должно быть обязательно четным и не менее двух. В качестве аргументов < пере менная1>, < переменная2> и т.д. могут использоваться любые символы (имена) LISP, не занятые в наименованиях функций. В качестве аргументов < выражение! >, < выражение2> и т. д. могут использоваться выражения LISP, имена переменных или константы (например, числа). Функция setq— основное средство для сохранения значений, возвращаемых другими выражениями. Пример: (setq myd (- (+ 6.832 200.1) (+ 423.1 33.22)))
Значение выражения сохранено в переменной myd По умолчанию в вещественных числах система AutoCAD показывает в командной строке не более шести значащих цифр. Например, если бы в итоге вычисления должен был бы получиться результат 329.65142, то все равно вы бы увидели в командной строке только 329.651. Однако внутри программы AutoCAD оперирует числами с максимальной точностью (15 знаков после десятичной точки). В текст программы полезно вставлять комментарии, поясняющие, например, особенности алгоритма. Комментарием считается часть строки, начиная с символа “; ” (точка с запятой), после которого не следует сразу же символ “|” (вертикальная черта), и кончая последним символом строки. Закомментированной может быть вся строка программы. Ecли комментарий нужно вставить в середину строки, тогда начатом комментария должны быть символы “; |” концом комментария — символы “; |” (причем конец комментария может располагаться на другой строке). Примеры (комментарии выделены полужирным шрифтом): ; Закомментирована вся строка (setq two_pi (+ pi pi)); Закомментирован конец строки (setq uv0 (+ 44.73;! внутренний коментарий |; 20 6.7)) (command " _.CIRCLE" ‘(14.0 6.6) 150.55); рисование окружности
Символы LISP — это слова, состоящие из группы буквенно-цифровых знаков и являющиеся именами функции или переменных, используемых для хранения данных пользователя. В символах LISP не должны использоваться разделители выражений, к которым относятся круглые скобки, пробелы и двойные кавычки, и служебные знаки — "." (точка), ", " (запятая), "; " (точка с запятой), (апостроф), " /" (косая черта), (обратная косая черта). Написание символов не должно соответствовать написанию чисел (например, символ не должен состоять из одних Цифр). Зарезервированными являются символы, используемые как имена функций, а также некоторые обозначения констант
Типы данных LISP работает с данными следующих типов: · целое число; · вещественное число; · строка; · список, точечная пара, точечный список; · дескриптор файла; · указатель функции, приложения; · примитив AutoCAD; · набор.
Символы Символам LISP могут быть присвоены значения любых типов. Символ языка LISP может в ходе программы менять тип своего значения. Пользователь в явном виде может задавать константы следующих типов: целые, вещественные, строковые и списковые. Целые числа могут быть как положительными, так и отрицательными или нулями. Диапазон допустимых значений — от-2 147 483 648 до +2 147 483 647. К целым числам относятся слова, состоящие лишь из цифр. Кроме того, целые числа могут иметь знак (+ или -). Если пользователь пытается задать целое число, не лежащее между описанными выше предельными значениями, то вводимое значение преобразуется в вещественное. Вещественные числа — это слова, которые состоят из цифр и содержат внутри только одну десятичную точку. Могут иметь знак (- или +). В состав вещественного числа может входить латинский символ е или E с показателем степени числа 10 (научная форма представления вещественных чисел).
Вещественные числа не должны начинаться с десятичной точки (например, вместо.5 следует писать 0.5). Допустимые значения вещественных чисел находятся в диапазоне от -1.7976931348623158е+308 до +1.7976931348623158е+308. Строковые константы начинаются и заканчиваются кавычками (сами кавычки в длину константы не входят) и содержат внутри себя текст, который может состоять из любых знаков, в том числе пробелов, скобок, апострофов. Особо рассматривается знак " \", который является служебным и предназначен для ввода в текстовую строку некоторых специальных знаков (например, кавычек и самого знака " \") Константа " " считается строкой нулевой длины. В строковые константы могут входить управляющие знаки печати, например: " \n" — переход на новую строку, " \t" — символ табуляции. Списковые константы — это списки, состоящие из постоянных элементов любого типа (списки, как и функции, открываются и закрываются круглыми скобками). Для того чтобы AutoCAD не вычислял выражение как функцию, постоянные списки предваряются апострофом перед открывающей скобкой. · 91 · -25408 · 539.3582 · 777.5е+3 · " Версия для печати" · " 336\\_5" (первая косая черта является служебной, вторая — значащим символом; если распечатать такую строку, то получим 336\_5) · '(0.0 0.0 1.0) · '(" Аа" " Бб" " Вв" " Гг" " Дц" " Ее") · '(0 75 " chair" 25 " window" 3 " " " & ") Особые списки, в которых только два элемента и разделителем между ними является точка, называются точечными парами. Они создаются с помощью функции cons. Примеры точечных пар: · (0. " POLYLINE") · (62. 29) Списки, которые состоят из трех или более элементов и у которых последний элемент отделяется точкой, называются точечными списками. Они могут создаваться с помощью функции vi-list*. Пример: · (120 14. 67) Функция setq возвращает значение, совпадающее со значением выражения, присваиваемого последней переменной (< переменнаяN>), поэтому тип результата совпадает с типом этого выражения. Предопределенные символы К основным зарезервированным символам, значения которых пользователям не рекомендуется изменять, помимо имен функций, относятся следующие: · т — единственная логическая константа, имеющая значение " истина"; · nil— пустое значение (оно же в логических операциях играет роль и значения " ложь"); это значение не эквивалентно числу 0 или пустой строке (" "); · pi— постоянная, равная отношению длины окружности к диаметру (3.14159...); · pause — постоянная, позволяющая ввести паузу при работе команды AutoCAD (используется в функции command).
Переменные Для хранения данных пользователь может вводить свои символы (переменные), не совпадающие по написанию с зарезервированными или ранее занятыми. Создание новых переменных осуществляется с помощью функции setq, например: (setq rl 15.33 s24 9) Здесь вводятся переменные rl и s24, получающие, соответственно, значения 15.33 (вещественное) и 9 (целое). При этом к той части оперативной памяти, которая отведена для текущего рисунка, добавляются участки, занимаемые переменными. Если переменной присвоить значение nil, то такая переменная из памяти удаляется, и ее место освобождается для других операций LISP В многодокументном режиме (когда в одном сеансе AutoCAD открыто несколько рисунков) переменные одного рисунка не доступны в другом рисунке. Для передачи требуется экспортировать переменные во внедокументное пространство имен
Функция load Ввод с клавиатуры выражений LISP не всегда удобен, поэтому можно записать предварительно свои строки на языке LISP в файл с расширением lsp (текст располагается в файле произвольным образом построчно, не обязательно каждое новое выражение начинать с новой строки; желательно заканчивать строку на разделителе— пробеле или скобке), а затем загрузить этот файл с помощью функции load. Синтаксис функции следующий: (load < файл> [ < ошибка> ]) Здесь < файл> — это строка с именем загружаемого файла, а < ошибка> — это выражение. которое нужно выполнить, или значение (например, строка с текстом сообщения), которое нужно вывести, если загружаемый файл не будет обнаружен. Возвращаемое значение в случае удачной загрузки — результат последнего выражения или имя последней функции, если в файле находятся определения функций. В случае если загружаемый файл не найден, то выполняется < ошибка> (оно может быть текстом сообщения об ошибке). Например: (load " e25run.lsp" " Файл не найден") Аргумент < ошибка> может быть опущен, в этом случае при ошибке загрузки выдастся стандартное сообщение AutoCAD. Аргумент < файл> обычно содержит имя файла, который ищется в соответствии с настройкой рабочего каталога и путей поиска файлов поддержки. Однако можно указывать и полное имя с путем — например, " c: /D_Progs/e25run.lsp" или " с: \\D_Progs\\e25run.lsp". В качестве разделителя каталогов может использоваться косая черта или обратная косая черта, но обратная черта должна обязательно удваиваться. Если расширение в имени файла опущено, то AutoCAD пытается выполнить загрузку, поочередно добавляя следующие расширения: vlx, fas, lsp. Расширение vlx соответствует файлам VLX-приложений, fas— компилированным LISP-файлам или файлам FAS-приложений, lsp— исходным LISP-файлам. Для непосредственного редактирования пользователю доступны только файлы с расширением lsp, т. к. файлы с расширениями vlx и fas не являются текстовыми.
Функция vl-load-all Система AutoCAD разрешает работу одновременно с несколькими открытыми документами (рисунками). Поэтому возникает проблема, загружен ли файл с расширением lsp в конкретный рисунок. Функция load выполняет загрузку только в текущий документ. Для того чтобы обеспечить загрузку LISP-файла во все уже открытые и открываемые в данном сеансе AutoCAD рисунки, следует пользоваться функцией vl-load-all: (vl-load-all < файл>) Аргумент < файл> — текстовая строка с именем файла (расширение файла может быть тем же, что и у первого аргумента функции load). Возвращаемого значения нет, если загрузка не выполнилась. Возвращается значение т в случае успешной загрузки.
|