АвтоЛИСП - реализация языка программированияРефераты >> Программирование и компьютеры >> АвтоЛИСП - реализация языка программирования
2. Функция должна быть определена с нулевым списком параметров (но локальные символы могут присутствовать).
Например, функция: нарисовать квадрат при помощи Полилиний определяет следующее:
(defun C:PSQUARE ('pt1 pt2 pt3 pt4 len)
(setq pt1 (getpoint "Lower left corner:"))
(setq len (getdist pt1 "Length of one side:"))
(setq pt2 (polar pt1 0.0 len))
(setq pt3 (polar pt2 ('PI 2.0) len))
(setq pt4 (polar pt3 PI len))
(Command "PLINE" pt1 pt2 pt3 pt4 "C")
)
Функции, определенные таким образом, могут быть вызваны просто введением части "ХХХ" имени функции, при появлении подсказки АвтоКАДа "Command:". Если "ХХХ" - неизвестная команда, АвтоКАД попытается вызвать функцию АвтоЛИСПа "С:ХХХ" без параметров. Например, при функции C:PSQUARE диалог будет следующим:
Сommand: PSQUARE
Lower left corner: (enter a point)
Нижний левый угол: (введите точку)
Length of one side: (enter a distance)
Длина стороны: (введите размер)
Затем функция вызовет команду АвтоКАДа PLINE и введет в ее подсказки: нарисовать желаемый квадрат. Добавление таким образом команды в АвтоКАД - очень мощное свойство АвтоЛИСПа. Однажды определенная, новая команда может использовать все свойства, предоставляемые АвтоЛИСПом. Фактическое применение новой команды не требует окружения имени команды параметрами, так что эта введенная АвтоЛИСПом команда, применяется также, как и любая другая команда АвтоКАДа.
4.38.(distance <pt1><pt2>)
Эта функция вводит расстояние между 2D точками <pt1> и <pt2>, где 2D точка - список из двух действительных чисел.
Например:
(distance '(1.0 2.5) '(7.7 2.5)) вводит 6.700000
(distance '(1.0 2.5) '(3.0 4.0)) вводит 2.828427
4.39. (eq <expr1> <expr2>)
Эта функция определяет, идентичны ли <expr1> и <expr2>, то есть, они фактически граничат с одним и тем же объектом (например,SETQ). EQ вводит T, если два выражения идентичны, в противном случае вводится ноль. Обычно она применяется для определения фактической идентичности двух списков. Например, даны следующие назначения:
(setq f1 '(a b c))
(setq f2 '(a b c))
(setq f3 f2)
тогда:
(eq f1 f2) вводит ноль (f1 и f2 - не один и тот же список!)
(eq f3 f2) вводит T (f3 и f2 - абсолютно одинаковые списки!)
См. также функцию EQUAL.
4.40 (equal <expr1><expr2>)
Эта функция определяет, равны ли <expr1> и <expr2>, т.е. вычисляются ли они к одному предмету. Например, заданы следующие назначения:
(setq f1 '(a b c))
(setq f2 '(a b c))
(setq f3 f2)
тогда:
(equal f1 f2) вводит T (f1 и f2 вычисляются к одному и тому же)
(equal f3 f2) вводит Т (f2 и f3 абсолютно одинаковые списки)
Обратите внимание, что в то время, как два списка равны, они могут быть неидентичны, атомы, когда они равны, они всегда идентичны. И, наконец, если любые два списка или атомы идентичны, они всегда равны.
4.41.(eval <expr>)
Вводит результат вычисленных <expr> (выражений), где <expr> - любое выражение ЛИСПа. Например, заданы назначения:
(setq a 123)
(setq b 'a)
тогда:
(eval 4.0) вводит 4.000000
(eval (abs - 10 )) вводит 10
(eval a) вводит 123
(eval b) вводит 123
4.42.(exp <number>)
Эта функция вводит е, возведенное в степень <числа> (обычный антилогарифм (antilog)). Она вводит действительные числа. Например,
(exp 1.0) вводит 2.718282
(exp 2.2) вводит 9.025013
(exp -0.4) вводит 0.670320
4.43. (expt <base><power>)
Эта функция вводит <базу>, возведенную в определенную <степень>. Если оба параметра целые числа, результат будет целым числом. В противном случае, результат будет действительным числом. Примеры:
(expt 2 4) вводит 16
(expt 3.0 2.0) вводит 9.000000
4.44. (fix <number>)
Эта функция вводит преобразование <числа> в действительное число. <Число> может быть как целым, так и действительным. Если оно действительное, оно усекается до ближайшего целого числа путем отбрасывания десятичной части. Например:
(fix 3) вводит 3
(fix 3.7) вводит 3.000000
4.45.(float <number>)
Эта функция вводит преобразование <числа> в действительное число. <Число> может быть как целым, так и действительным. Например:
(float 3) вводит 3.000000
(float 3.7) вводит 3.700000
4.46.(foreach <name><list><expr>)
Эта функция проходит через <список>, присваивая <числа> каждому элементу и вычисляет каждое <выражение для каждого элемента в списке>. Любое количество <выражений > может быть определено. FOREACH вводит результат вычисления последнего <выражения>. Например:
(foreach n'(a b c)(print n))
эквивалентно
(print a)
(print b)
(print c)
кроме того FOREACH вводит результат только последнего вычисленного выражения.
4.47.(gcd <num1><num2>)
Эта функция вводит наибольший общий знаменатель <числа1> и <числа2>. <Число1> и <число2> должны быть целыми. Например:
(gcd 81 57) вводит 3
(gcd 12 20) вводит 4
4.48.(getangle [<pt>][<prompt>]
Для пользователя эта функция приостанавливает ввод угла. <Подсказка> - произвольная строка, которая появляется на экране в качестве подсказки, а <pt> - произвольная базовая точка 2D. Вы можете определить угол, напечатав цифру в текущем формате единиц угла АвтоКАДа. Отметьте, что хотя текущий формат единиц угла может быть выражен в градусах, градах и т.д., эта функция всегда вводит угол в радианах.
Вы можете также "показать" АвтоЛИСПу угол, отмечая точками два 2D расположения на экране графики. АвтоКАД рисует линию резиновой нити от первой точки до позиции текущего перекрестия, что поможет вам при визуализировании угла.
Необязательный параметр <pt> функции GETANGLE (если он определен) предполагается быть первой из этих двух точек, позволяя вам "показать" АвтоЛИСПу" угол, отмечая еще одну точку. Вызов GETANGLE демонстрирует следующее:
(setq ang (getangle))
(setq ang (getangle '(1.0 3.5))
(setq ang (getangle "Which way?")
(setq ang (getangle '(1.0 3.5)"Which way?")
Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование GETANGLE. Попытка сделать это приведет к сообщению "Can't reenter Autolisp" (Не могу повторно ввести АвтоЛИСП"). См. также GETORIENT и INITGET.
4.49. (getcorner <pt>[<prompt>])
Функция GETCORNER вводит точку так же, как и GETPOINT. Однако, GETCORNER требует параметр <базовой> точки и чертит прямоугольник из <базовой> точки по мере перемещения пользователем пересечения на экране. Для детального ознакомления см. GETPOINT и INITGET. В качестве ответа на требование GETCORNER, вы не можете ввести другое выражение ЛИСПа.