Функции, работающие со списками и точечными парами
Функции вычислений
К основным вычислительным функциям относятся следующие функции:
- (fix <число>) - усечение числа до целого (отбрасывается дробная часть);
- (rem [<число1> [<число2> ... [<числоN>] ... ]]) - получение остатка от деления аргументов <число1> на <число2>, затем остатка от деления результата на аргумент <число3> и т. д.;
- (mах [<число1> [<число2> ... [<числоN>] ... ]]) - определение максимального из чисел;
- (min [<число1> [<число2> ... [<число1N>] ... ]]) - определение минимального из чисел;
- (gcd <число1> <число2>) - вычисление наибольшего общего делителя для двух положительных целых чисел;
- (angle <точка1> <точка2>) - вычисление угла, в радианах, между осью Х текущей системы координат и вектором, идущим из точки заданной аргументом <точка1> в точку заданную аргументом <точка2>;
- (distance <точка1> <точка2>) - вычисление расстояния между двумя точками, заданными аргументами <точка1> и <точка2>;
- (sqrt <число>) - вычисление квадратного корня;
- (sin <число>) - вычисление синуса угла;
- (cos <число>) - вычисление косинуса угла;
- (atan <число1> [<число2>]) - вычисление арктангенса; если второй аргумент опущен, то вычисляется арктангенс от первого аргумента <число1>; если заданы оба аргумента, то вычисляется арктангенс частного от деления первого аргумента на второй <число1>/<число2>; если аргумент <число2> равен нулю, то возвращается угол +pi/2 или -pi/2 (знак выбирается по знаку аргумента <число1>);
- (ехр <число>) - вычисление натурального антилогарифма- результата возведения в степень постоянной е (2.71828);
- (expt <основание> <степень>) - возведение числа в степень;
- (log <число>) - вычисление натурального логарифма.
Примеры:
(fix -10.083) - возвращает -10;
(fix 40.45) - возвращает 40;
(rem 14 2) - возвращает о (результат целый, т. к. оба аргумента целые);
(rem 12.9 3.5) - возвращает 2.4;
(max 7 3.4 2.0092) - возвращает 7.о (результат вещественный, поскольку есть вещественные аргументы);
(min 7 3.4 2.0092) - возвращает 2.0092;
(gcd 42 12) - возвращает б;
(angle ' (0 0) ' (50.0 50.0)) - возвращает 0.785398;
(distance ' (0 0) ' (250.0 0.0)) - возвращает 250.0;
(sqrt 25) - возвращает 5.0;
(sin 0.0) - возвращает 0.0;
(cos 0.0) - возвращает 1.0;
(atan 1) - возвращает 0. 785398;
(atan -1 0) - возвращает -1.5708;
(ехр 1) - возвращает 2.71828;
(expt 2 2) - возвращает 4 (оба аргумента целые);
(expt -2 2.0) - возвращает 4.0;
(log 1) - возвращает 0.0.
Следующая группа функций - это функции, работающие со списками и точечными парами. Точечная пара - это двухэлементный список вида (а . b), в котором в качестве особого разделителя выступает точка (точка в такой записи отделяется пробелом как от первого, так и от второго элементов). Точечные пары используются для хранения в файлах системы AutoCAD данных о графических примитивах. Первый элемент точечной пары обычно является целым числом и называется DXF-кодом, а второй - данными этого кода. Основной способ получения точечных пар - функция cons.
Есть отличия в работе некоторых функций со списками и с точечными парами.
Функция list - это основная функция, позволяющая создать список:
(list (<элемент1> [<элемент2> ... [<элементN>] ... ] ] )
В качестве аргументов <элементы>, из которых образуется список, могут выступать любые объекты, которыми оперирует AutoLISP. Самый распространенный список - это список из двух или трех вещественных чисел, представляющий точку.
В качестве элементов списка могут выступать другие списки или точечные пары.
Примеры:
(list 12.12 0.34 5.88) - возвращает (12.12 0.34 5.88);
(list 1 "ad2" (list 0 1 2)) - возвращает (1 "ad2" (0 1 2)) (третьим элементом нового списка является список из чисел 0, 1 и 2).
Следующие функции выполняют основные операции со списками:
- (append [<список1> [<список2> ... [<списокN>] ... ] ] ) - слияние списков в один;
- (nth <номер> <список>) - извлечение из списка элемента по порядковому номеру (нумерация элементов списка выполняется слева направо и начинается с нуля);
- (reverse <список>) - переворот списка;
- (car <список>) - извлечение первого элемента списка или точечной пары;
- (cdr <список>) - извлечение из списка подсписка путем удаления первого элемента, если аргумент <список> является простым списком (т. е. не точечной парой), или извлечение второго элемента, если <список> является точечной парой.
Примеры:
(append '(14 16) '(12.12 0.34 5.88)) - возвращает (14 16 12.12 0.34 5.88);
(nth о '(12.12 0.34 5.88)) - возвращает 12.12;
(reverse '(12.12 0.34 5.88)) - возвращает (5.88 0.34 12.12);
(car '(12.12 0.34 5. 88)) - возвращает 12.12;
(car '(62 . 1)) - возвращает 62;
(cdr '(12.12 0.34 5.88)) - возвращает (0.34 5.88);
(cdr ' (62 . 1)) - возвращает 1.
От функции car и cdr путем их повторения в разных комбинациях от двух до четырех раз в языке AutoLISP образованы следующие функции (их двадцать восемь):
- (сааr <список>) -равносильно (car (car <список>));
- (cadr <список>) -равносильно (car (cdr <список>));
- (cdar <список>) -равносильно (cdr (car <список>));
- (cddr <список>) -равносильно (cdr (cdr <список>));
- (саааr <список>) - равносильно (car (car (car <список>)))
- (caadr <список>) - равносильно (car (car (cdr <список>)))
- (cadar <список>) - равносильно (car (cdr (car <список>)))
- (caddr <список>) - равносильно (car (cdr (cdr <список>)))
- (cdaar <список>) - равносильно (cdr (car (car <список>)))
- (cdadr <список>) -равносильно (cdr (car (cdr <список>)))
- (cddar <список>) - равносильно (cdr (cdr (car <список>)))
- (cdddr <список>) -равносильно (cdr (cdr (cdr <список>)))
- (caaaar <список>) -равносильно (car (car (car (car <список>))));
- (caaadr <список>) -равносильно (car (car (car (cdr <список>)))).
Аналогичным методом раскрываются оставшиеся функции (caadar, caaddr, cadaar, cadadr, caddar, cadddr, cdaaar, cdaadr, cdadar, cdaddr, cddaar, cdddar, cddadr, cddddr).
Функция cons добавляет к списку первый элемент или создает точечную пару:
(cons <аргумент1> <аргумент2>)
Если <аргумент2> является списком, то функция cons добавляет в него <аргумент1> в качестве нового первого элемента. Если <аргумент2> является атомом (т. е. не списком), то функция cons создает точечную пару типа (<аргумент1> . <аргумент2>).
Примеры:
(cons 67.4 '(10.3 12.9 -3.9)) - возвращает (67.4 10.3 12.9 -3.9);
(cons "Happy" '("New" "Year")) - возвращает ("Happy" "New" "Year");
(cons 2 4) - возвращает (2 . 4);
(cons 8 "0") - возвращает (8 . "0");
(cons 62 l) - возвращает (62 . l).
Функция member проверяет принадлежность элемента списку:
(member <элемент> <список>)
Если функция member обнаруживает <элемент> в аргументе <список>, то возвращает остаток списка, начиная с этого места; если <элемент> в аргументе <список> не обнаруживается, то функция возвращает nil.
Примеры:
(member 1 '(4 50 1 2)) - возвращает (1 2);
(member 4 '(4 50 1 2)) - возвращает (4 50 1 2);
(member 0 '(4 50 1 2)) - возвращает nil.