Интерпретатор AutoLISP

 

В AutoCAD входит интерпретатор AutoLISP, начинающий работать, если вы в командной строке в ответ на стандартную подсказку Команда: (Command:) введете открывающую скобку "(". В этот момент AutoCAD настраивается на прием и вычисление выражения AutoLISP, которое должно иметь форму списка, т. е. начинаться открывающей скобкой и заканчиваться закрывающей скобкой - ")", а элементы списка должны отделяться друг от друга пробелами. Например, для получения суммы трех чисел вы можете ввести - (+ 223.75 16.002 89.899). Как только вы завершите ввод своего выражения нажатием на клавишу <Enter>, система AutoCAD вычислит его и выдаст результат: 329.651 (десятичная точка в вещественных числах играет роль разделителя между целой и дробной частями).

В приведенном примере для вычисления было подано выражение, открывающееся и закрывающееся круглыми скобками и состоящее из четырех элементов: первый - имя функции сложения ("+"), остальные - аргументы функции, т. е. слагаемые (223.75, 16.002 и 89.899). Это иллюстрирует форму вычисляемых выражений языка AutoLISP: (<функция> [<аргумент1> [<аргумент2> ... [<аргументN> ]...]]). Здесь <функция> - это имя функции; <аргумент1>, <аргумент2>, ... , <аргументN> - аргументы функции, разделяемые, по крайней мере, одним пробелом. Квадратные скобки в приведенной форме указывают на то, что, начиная с некоторого места, аргументы могут быть опущены. Количество аргументов зависит от синтаксиса функции. Существуют функции, которые вызываются без аргументов.

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

Основное правило AutoLISP - баланс скобок, т. е. сколько скобок открыто, столько должно быть и закрыто. Иначе AutoCAD, обнаружив дисбаланс (например, если пользователь забыл ввести конечную скобку), выдаст об этом соответствующее сообщение.

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

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

(- (+ 56.022 78.11) (+ 123.77 78.0))

Здесь "-" - имя функции (вычитание), имеющей два аргумента в виде выражений, каждое из которых является операцией сложения (т. к. в них использована функция сложения "+"). Сначала интерпретатор AutoLISP вычислит выражения во внутренних скобках (в нашем примере получатся результаты 134.132 и 201.77), а затем подставит полученные значения и вычислит выражение (-134.132 201.77), что должно дать результат -67.638 (отрицательное число).

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

(setq <переменная1> <выражение1> [<переменная2> <выражение2> ... [<переменнаяN> <выражениеN>] ... ] )

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

Функция setq - основное средство для сохранения значений, возвращаемых другими выражениями.

В текст программы полезно вставлять комментарии, поясняющие, например, особенности алгоритма. Комментарием считается часть строки, начиная с символа ";" (точка с запятой), после которого не следует сразу же символ "|", и кончая последним символом строки. Закомментированной может быть вся строка программы.