В языке AutoLISP прописные и строчные буквы отождествляются, аналогично, например, языку Pascal.
Основной конструкцией языка является список.
Список имеет вид ‘(© © … ©), если он является константой, или (© © … ©), если выражение в скобках необходимо вычислить или выполнить.
© - элемент списка, который может быть:
· встроенной функцией;
· константой;
· идентификатором;
· списком (то есть вложенным списком).
Ниже перечислены допустимые типы констант и идентификаторов, а также их некоторые особенности:
· целые в диапазоне -32768…32767;
· вещественные (действительные); вещественные константы не должны начинаться с десятичной точки;
· текстовые (строковые) – набор символов в двойных кавычках;
· логические, принимающие значения T – true, истина или 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 |
Этот прием можно использовать для выполнения макрокоманд, состоящих из последовательности элементарных операций.