Введение в Автолисп

Рыжиков Роман Клавдиевич

1. ОБЩИЕ СВЕДЕНИЯ

 

 

Современный Автолисп является мощным функциональным языком, позволяющим работать с глубоко структурированными программными объектами. В отличие от операторных языков программирования, таких как Фортран, Паскаль и т.п., основой Автолиспа являются не операторы, а встроенные или внешние функции.

Автолисп хорошо взаимодействует с базами числовых и графических данных. В качестве числовых баз данных могут использоваться продукты многих СУБД (например, dBASE), таблицы, файлы результатов, полученные в результате выполнения других программ. Последнее обстоятельство очень важно, поскольку позволяет связать с Автолиспом любые операторные программы, достаточно лишь создать выходные файлы этих программ в формате, поддающемся чтению средствами Автолиспа. Что касается графических баз данных, то, рассматривая чертеж как такую базу, пользователь может извлекать из нее отдельные примитивы и их наборы и осуществлять над ними программным путем любые операции, доступные Автолиспу. Кроме того, возможно создание программ, которые, руководствуясь введенными параметрами, способны вычерчивать сколь угодно сложные графические объекты. Несколько подобных программ (разумеется, достаточно простых) описаны в настоящем пособии.

С целью облегчения ориентирования в тексте пособия служебные слова, выполняющие различные функции, выделяются разными шрифтами. В табл. 1 приведены гарнитуры шрифтов, используемые в дальнейшем для выделения отдельных элементов программ. Эти гарнитуры используются только в тексте пособия, полные тексты программ на Автолиспе и отдельные извлечения из них, используемые в качестве примеров, выполняются гарнитурой Arial.

Если Автолисп подключен к Автокаду, любая функция Автолиспа, введенная в командную строку, обрабатывается, а результат обработки возвращается в поле сообщений. Это очень удобно как при отладке программ, так и при проверке правильности записи функций. Если во время сеанса активизирована программа, написанная с ошибками, Автолисп прекращает ее обработку, сообщает об ошибке и производит обратную трассировку программы, указывая то место, где она совершена.

Tаблица 1. Гарнитуры шрифтов, используемые в пособии

Гарнитура Область использования Примеры
Times New Roman Cyr Имена примитивов Arc, Line, Donut
To же, полужирный Команды Автокада save, copy, line
To же, курсив Имена файлов, сообщения командной строки c:\acad\bolt.lsp From point:_
Arial Тексты программ, имена переменных setq pt (1 2)) bolt, file1
To же, полужирный Имена функций Автолиспа setq, getdist
Arial полужирный курсив Аргументы функций string [mode]

 

1.1. Типы данных в Автолиспе

Автолисп может оперировать следующими типами данных:

• Идентификаторы (Symbols) или переменные (Variables)

• Целые числа (Integers)

• Вещественные числа (Real numbers)

• Строки (Strings)

• Списки (Lists)

• Дескрипторы файлов (File descriptors)

• Имена примитивов Автокада (AutoCAD entity names)

• Наборы примитивов Автокада (AutoCAD selection sets)

• Встроенные (Subrs) и внешние (External Subrs) функции

Идентификаторы или переменные. Эти два термина в Автолиспе идентичны. Подобно любым языкам программирования Автолисп для идентификации переменных использует их имена. Значение переменной определяется ее параметрами аналогично тому, как это принято в других языках. В соответствии с синтаксисом Автолиспа каждая законченная структурная единица заключается в круглые скобки, а входящие в нее параметры, команды и функции разделяются пробелами.

В качестве примера приводится установка переменной pt1, рассматриваемой как точка в поле чертежа:

(setq pt1 ‘(1 2)).

Здесь встроенная функция присвоения setq устанавливает имя переменной pt1 и идентифицирует ее с точкой, имеющей координаты х=1, у=2.

Три переменные Автолиспа определены заранее, и их значения не рекомендуется изменять. К ним относятся:

pause - переменная определена как строка, состоящая из одного символа - обратной косой черты (\ - backslash) - и используется в функции command для организации паузы при необходимости ввода данных оператором;

pi - переменная определена как константа π, оцениваемая приблизительно в 3.1415926;

T - переменная определена как константа T и имеет тот смысл, что ее значение - не nil.

Целые числа. Автолисп обменивается с Автокадом целыми числами, не превышающими 16 бит. Таким образом, могут быть введены целые числа в интервале от -32768 до +32767.

Вещественные числа. К вещественным относятся числа, содержащие символ десятичной точки. Числа, лежащие в интервале -1...+1 должны обязательно сопровождаться предваряющим нулем. Вещественные числа, не имеющие десятичных долей, должны содержать ноль после десятичной точки. Вследствие этого правильным является представление 0.245 и 34.0, а записи .245 и 34. не всегда будут приняты Автолиспом. Точность вычислений Автолиспа - 14 значащих цифр, хотя в поле командной строки выводится не более 6 знаков.

Строки. Любая последовательность символов, заключенная в кавычки, рассматривается Автолиспом как строковая переменная. Длина одной строки не должна превышать 132 символов, однако использование функции strcat позволяет объединить несколько строк в одну.

Списки. Для идентификации переменных Автолисп широко использует параметры, представленные в виде списков. Координаты точки в предыдущем примере являются списком, определяющим положение точки на плоскости. Соответственно список, определяющий точку в пространстве, выглядит подобно следующему:

(3.62 4.12 2.85).

В одном списке могут содержаться самые различные типы данных - целые и вещественные числа, строки, списки, имена и наборы примитивов, дескрипторы файлов.

Дескрипторы файлов являются строковыми метками, присваиваемыми файлам, открываемым Автолиспом. В следующем примере открывается файл mycalc.res, он становится доступным для чтения функциями Автолиспа, и значение дескриптора файла присваивается переменной file1:

(setq file1 (open “mycalc.res” “r”)).

Термин “дескриптор” в общем случае понимается как некоторый признак, выделяющий объект из множества себе подобных (вспомните, например, дескрипторы атрибутов). Поэтому в дальнейшем параллельно с этим термином может употребляться термин “имя файла”. И хотя эти термины определяют несколько отличающиеся понятия, при оценке их содержания следует руководствоваться контекстом.

Имена примитивов. Имя примитива представляет собой числовую метку, присваиваемую примитиву в рисунке. Извлекая примитив по имени, его можно обрабатывать всеми доступными способами.

В следующем примере имени примитива, введенного в чертеж последним, присваивается идентификатор e1:

(setq e1 (entlast)).

Ввод этого выражения в командную строку возвращает имя примитива в следующей форме:

.

Наборы (группы) примитивов. Средства Автолиспа позволяют аналогично идентифицировать группу примитивов для дальнейшей обработки их программными средствами Выбранной группе присваивается метка. В приводимом ниже примере идентификатор ss2 присваивается группе примитивов, определенных предпоследним выбором:

(setq ss2 (ssget “р”)).

Встроенные и внешние функции - это функции, посредством которых осуществляется обработка данных. Встроенные функции являются средствами самого Автолиспа, внешние представляют собой программы, определенные приложениями.

 

1.2. Лексические соглашения

Ввод данных в Автолиспе может осуществляться различными способами: с клавиатуры в строку запроса, непосредственным указанием точек на экране, чтением файла ASCII или строковой переменной. В любых случаях должны, выдерживаться следующие соглашения.

• Имена переменных могут содержать любые символы, за исключением (, ) - левой и правой скобок, . - точки, ' - апострофа, “ - кавычек, ; - точки с запятой.

• Следующие символы заканчивают имя переменной или цифровую константу: (, ), ‘, ; , space (cимвoл пpoбeлa), end of file (символ конца файла).

• Выражение может занимать несколько строк.

• Множество пробелов между символами эквивалентно одному пробелу. Пустые строки не обрабатываются Автолиспом, но иногда их целесообразно вставлять для облегчения чтения программ. Табуляция рассматривается Автолиспом как пробел.

• В Автолиспе не имеет значения регистр символов. Для англоязычной версии Автокада имена функций, переменных и параметров можно записывать как в верхнем, так и в нижнем регистре.

• Целочисленные константы могут начинаться со знаков плюс или минус. Автолисп оперирует 32-битовыми числами, т.е. ему доступны целые числа от -2 147 483 648 до +2 147 483 647. Однако, как упоминалось выше, обмен с Автокадом возможен лишь на 16-битовом уровне.

• Вещественные константы также могут начинаться со знаков плюс или минус и должны обязательно содержать цифры, предшествующие десятичной точке и следующие за ней. Вещественные константы могут записываться в экспоненциальной форме. Например, записи 0.00032 и З.2е-4 являются идентичными.

• Текст программ может содержать строки комментариев, предваряемых точкой с запятой (;), например:

     ; переход в слой CENTER.

• Если комментарий включается в строку программы, он должен выделяться символами ;|....|; .

     (setq omode ;| здесь начинается комментарий,

     здесь он продолжается,

     здесь заканчивается |; (getvar “osmode”))

• Текстовые строки должны заключаться в двойные кавычки. Включение в текстовую строку обратной косой черты (\), иногда называемой обратным слэшем, позволяет ввести управляющие символы, перечисленные в табл. 2.

Tаблицa 2. Значение некоторых управляющих символов

Символ Значение
\\ Символ \
\” Символ “
\e Символ Escape-последовательности
\n Символ перехода на следующую строку
\r Символ возврата каретки
\t Символ табуляции
\nnn Произвольный символ в восьмиричном коде

 

1.3. Выражения и переменные Автолиспа

Основной структурной единицей Автолиспа является выражение. Любое выражение открывается круглой скобкой, состоит из имени функции и списка аргументов, каждый из которых сам может быть выражением, и закрывается парной правой скобкой. В связи с тем, что выражения могут занимать несколько строк, принято их зрительно структурировать, вписывая закрывающую выражение скобку в тот же столбец, что и открывающую. Такая система записи облегчает чтение программ и уменьшает количество ошибок. Аргументы в выражениях разделяются пробелами.

Автолисп не обладает отладчиком программ, но ему свойственна другая полезная особенность. Если выражение Автолиспа ввести в командную строку Автокада, Автолисп обрабатывает его и возвращает его значение. Это позволяет производить отладку программ, поскольку неадекватная реакция среды сразу указывает на ошибку.

При вводе некорректного выражения Автолисп может выдать указание n>, где n указывает количество незакрытых левых скобок. Довольно частой ошибкой является пропуск правых кавычек (“) в текстовых строках. При этом правые скобки интерпретируются как кавычки, и простой ввод дополнительных скобок не исправляет положения. В таких случаях следует прекратить вычисления командой отказа Ctrl+С в DOS или Esc в Windows и заново ввести выражение.

Обработанное интерпретатором Автолиспа выражение может быть далее использовано окружающими выражениями. Если такого окружения нет, Автолисп передает значение выражения Автокаду.

В распространяемый с 1999 года пакет AutoCAD 2000 в качестве составной части включен пакет Visual LISP, обладающий отладчиком программ. Возможности работы в среде Visual LISP описаны в публикации [1].

Выражения Автолиспа записываются в формате

(function_name [arguments]...)

(имя_функции [аргументы]...).

В дальнейшем, как это принято в литературе по программированию, аргументы, которые не являются обязательными и могут быть опущены, в описании формата выражений заключаются в квадратные скобки. Многоточие, заключающее выражение перед закрывающей круглой скобкой, указывает на то, что список аргументов может быть продолжен.

Существует четыре типа переменных Автолиспа: целые, вещественные, точки и строки. Тип переменной автоматически определяется Автолиспом и должен соответствовать типу, воспринимаемому конкретной функцией. Значение переменной сохраняется до конца сеанса или до замены его другим значением. Имя переменной должно начинаться с алфавитного символа. Запрещенные символы перечислены выше.

 

1.4. Основная функция присвоения в Автолиспе

Любой язык программирования, встречая некоторую именованную переменную, сопоставляет ей ее значение. Это значение в операторных языках обычно вычисляется и присваивается переменной с помощью оператора присвоения. Особенностью Автолиспа является то, что в переменной может храниться не только вычисленное значение, но и целое выражение. Этот язык содержит в своем составе функцию quote, позволяющую сохранить выражение без его оценки. Формат функции:

(quote выражение),

например:

(quote а) возвращает А,

(quote (a b c)) возвращает (А В С),

(quote (+ 1 4)) возвращает (+ 1 4).

В практике создания программ слово quote заменяется апострофом. Автолисп совершенно одинаково воспринимает и обрабатывает записи:

(quote (a b c)) и '(a b с).

Основной функцией присвоения переменной ее значения является функция

(setq перем1 выраж1 [перем2 выраж2 ...] ).

Функция setq, позволяет присвоить значения нескольким переменным, однако возвращает только последнее выражение. Например:

(setq a 5.4) возвращает 5.4,

(setq a 5.4 b 8.7 с “width”) возвращает "width”,

(setq x ‘(a b)) возвращает (A В).

На примере функции setq хорошо видно действие функции quote. Так, например:

(setq x (+ 1 4)) возвращает 5,

(setq x ‘(+ 1 4)) возвращает (+ 1 4).

Поскольку функция quote сохраняет выражение без его оценки, элементы этого выражения, по сути дела, являются списком. Поэтому для записи такого выражения во многих случаях можно использовать функцию организации списков list. Следующие два примера определения точки на чертеже для Автолиспа эквивалентны:

(setq pt1 ‘(3.0 4.5)),

(setq pt1 (list 3.0 4.5)).

Поскольку Автолисп всегда проверяет, является ли первый элемент выражения функцией, то выражение типа

(setq pt1 (3.0 4.5))

не будет принято; Автолисп выдаст сообщение об ошибке (в данном случае bad function, т.е., неверная функция), так как численный параметр 3.0 представляет собой вещественное число, а не функцию.