Элементы языка AutoLISP

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

Основной конструкцией языка является список.

Список имеет вид ‘(© © … ©), если он является константой, или (© © … ©), если выражение в скобках необходимо вычислить или выполнить.

© - элемент списка, который может быть:

· встроенной функцией;

· константой;

· идентификатором;

· списком (то есть вложенным списком).

Ниже перечислены допустимые типы констант и идентификаторов, а также их некоторые особенности:

· целые в диапазоне -32768…32767;

· вещественные (действительные); вещественные константы не должны начинаться с десятичной точки;

· текстовые (строковые) – набор символов в двойных кавычках;

· логические, принимающие значения Ttrue, истина или Nil – ложь;

· точечная пара – особый двухэлементный список вида (a. b), в котором разделителем элементов списка выступает точка с пробелами; точечные пары используются для работы с примитивами рисунка;

· точечный список – особый многоэлементный список вида

(a1 a2 … an. b);

· файловые дескрипторы;

· имена графических примитивов AutoCAD;

· наборы AutoCAD (например, графических примитивов).

Существуют еще некоторые более сложные типы данных.

Имеется одно существенное отличие языка AutoLISP от многих других языков программирования: идентификаторы в ходе выполнения программы могут менять свой тип.

Основным средством для сохранения значений, вычисляемых другими выражениями, является функция setq. Рассмотрим фрагменты программ, написанных на языках AutoLISP и Pascal, выполняющих операции присваивания.

AutoLISP Pascal
(setq a 1 b 2 c (+ a b)) a:=1; b:=2; c:=a+b;

Оба фрагмента могут быть записаны в одну строку. На языке AutoLISP это будет выглядеть следующим образом:

(setq a 1 b 2 c (+ a b))

Если переменной присвоить значение “ nil ”, то такая переменная удаляется из памяти.

Для выполнения различных команд AutoCAD а применяется функция command. Чаще всего функция command используется для вывода (получения на экране изображения) графических примитивов, например:

(setq p1 ‘(10 10) p2 ‘(50 100) p3 ‘(0 0)) (command “line” p1 p2 p3 “”) ;задание координат точек p1, p2, p3 ;проведение линии

В данном примере координаты точек заданы в виде списков-констант.

В команде вывода отрезков символы “” эквивалентны нажатию клавиши ESC при «ручном» черчении.

Если AutoCAD русифицирован, то возможно использование русских имен графических примитивов, например:

(command “отрезок” p1 p2 p3 “”)

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

(command “_line” p1 p2 p3 “”)

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

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

(command “_line” p1 p2 p3 “_c”)

В данном примере ломаная линия, состоящая из двух отрезков, будет замкнута от последней точки к первой.

С помощью одной функции command можно обратиться к нескольким командам:

(command “_color” 2 “_line” p1 p2 “”)

или:

(command “_color” 2 “_line” p1 p2 “”)

Для выполнения команд AutoCAD существует еще одна функция – vl-cmdf. Основное ее отличие от функции command:

· функция command выполняет последовательно записанные в нее команды и выражения;

· функция vl-cmdf предварительно проверяет все записанные в нее команды и выражения на выполнимость; это исключает возможность частичного (незавершенного, ошибочного) выполнения команд.

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

Имена файлов в AutoLISP являются символьными данными и заключаются в кавычки.

Имена файлов в AutoLISP формируются по обычным правилам операционных систем, за исключением того, что вместо символа обратной косой черты «\», разделяющего имена дисков, папок и файлов, используется символ прямой косой черты «/», например:

c:/Program Files/ACAD2000/acad2000.cfg ”.

В то же время можно использовать и обратную косую черту, но в виде двойной косой черты «\\»:

“c: \\Program Files\\ACAD2000\\acad2000.cfg ”.

В разделе 3 была рассмотрена простая структура пользовательской функции без аргументов и локальных переменных. Если в функцию необходимо передавать данные для обработки и (или) воспользоваться аппаратом локальных переменных, то структура пользовательской функции будет иметь следующий вид:

(defun имяфункции (аргументы / локпеременные) (выражения) )

Аргументы (необязательные параметры) – переменные, разделяемые пробелами, которые используются в качестве аргументов функции. Понятию «аргументы» соответствует понятие «параметры процедур» во многих других алгоритмических языках программирования.

Локальные переменные (необязательные параметры) – разделяются пробелами. К локальным переменным имеет доступ только та функция, где они объявлены.

Значения аргументов и локальных переменных не являются глобальными и не доступны другим функциям.

Признаком хорошего стиля программирования является использование локальных переменных всегда, когда они нужны только внутри какой-либо функции. Это экономит память, отводимую под данные, и повышает «понятность» текста программы.

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

(имяфункции a1 a2 …)

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

Этими переменными могут пользоваться все приложения (например, пользовательские LISP -программы), загружаемые в данный чертеж, что удобно при организации взаимодействий различных приложений в одном чертеже. Однако избыточное количество глобальных переменных отнимают память в пространстве имен. Освободить участок памяти, занимаемый глобальной переменной, можно присвоением ей значения nil.

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

Существует еще одна область памяти – внедокументное пространство имен (blackboard). Оно играет роль буфера, в который копируются переменные, необходимые нескольким документам (чертежам). С помощью специальных функций LISP -программа, выполняемая в одном чертеже, может передать в blackboard значения переменных, а другая LISP -программа другого чертежа может этими переменными воспользоваться.

Язык LISP является мощным средством обработки списков. Вместо функции defun можно использовать функцию defun-q. Она аналогична функции defun. Отличие заключается в том, что в имени пользовательской функции сохраняется исходный текст функции в виде списка. Имя пользовательской функции можно использовать как обычную переменную, вплоть до того, что можно создать функцию, которая изменяет свой собственный исходный текст (сама себя программирует).

В языке AutoLISP есть средства для создания новых команд AutoCAD.

Пользовательские функции, имена которых начинаются с префикса c:, а сами функции не содержат аргументов, определяют новые команды системы AutoCAD.

(defun c:mycom () (выражения) )

После загрузки текста функции mycom в память к ней можно обратиться в командной строке AutoCAD:

Command: mycom

Этот прием можно использовать для выполнения макрокоманд, состоящих из последовательности элементарных операций.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: