Смекни!
smekni.com

АвтоЛИСП - реализация языка программирования (стр. 5 из 10)

начинает команду CIRCLE, устанавливает центральную точку 5,5 и затем-пауза, позволяющая смещать радиус окружности на экране. Когда вы укажете необходимые точки (или напечатаете необходимый радиус), функция продолжает работу, рисуя линию от 5,5 до 7,5.

Меню ввода не отменяется паузой АвтоЛИСПа. Если элемент меню активен когда функция COMMAND находится в паузе для ввода, это требование ввода может быть удовлетворено при помощи меню. Если вы хотите отменить и элементы меню, вы должны ввести мертвый ход в элемент меню. Когда обнаружен действительный ввод, будут продолжаться как функция COMMAND, так и элемент меню.

4.34 (cond (<test1> <result1>...)

Эта функция принимает в качестве параметров любое количество списков. Она вычисляет первый элемент каждого списка (в установленной последовательности) пока один из этих элементов введет значение, отличное от нуля. Затем она вычисляет те выражения, которые следуют за тестом, и вводит значение последнего выражения в подсписке. Если в подсписке только одно выражение (например, пропущен <result>),вводится значение выражения <test>. COND - исходная условная функция в АвтоЛИСПе.

Например,в этом случае COND используется для выполнения расчетов абсолютного значения:

(cond (minusp a) (-a))

(t a)

)

Если для "а" было установлено значение -10, будет введено 10. Как показано, COND может применяться как функция типа "case". Общепринято использовать T как последнее (по умолчанию) <тестовое> выражение. Далее, другой пример. Задана ответная строка пользователя в виде символа "s", эта функция проверяет ответ и вводит 1, если он "Y" или "y" и 0, если он "N" или "n", в остальных случаях -nil (нуль).

(cond (( = s "Y") 1)

(( = s "y") 1)

(( = s "N") 0)

(( = s "n") 0)

( t nil)

)

4.35 (cons <new first element> <list>)

Это основной список КОНСтруктора. Он берет элемент (<новый первый элемент>) и список (<список>), и вводит дополнение этого элемента в начало списка. Например:

(cons 'a '(b c d)) вводит (A B C D)

(cons '(a) '(b c d)) вводит ((A) B C D)

Обратите внимание, что первый элемент может быть атомом в списке. CONS также допускает атом на место параметра в <списке>, создающего структуру, известную как dotted pair (точечная пара). Когда на экран выдается точечная пара, АвтоЛИСП печатает период или точку между первым и вторым элементом пары. Точечные пары занимают меньше места в памяти, чем обычные списки; функция CDR может применяться для ввода второго атома. Таким образом:

(cons 'a 'b) вводит ( A . B)

(car (cons 'a 'b)) вводит A

(cdr (cons 'a 'b)) вводит B

4.36 (cons <angle>)

Эта функция вводит косинус <угла>, где <угол> выражен в радианах. Например:

(cos 0.0 ) вводит 1.000000

(cos pi ) вводит -1.000000

4.37 (defun <sym><argument list><expr>...)

DEFUN определяет функцию под именем <sym> (обратите внимание, что имя функции автоматически взято в угловые скобки, так что она не должна заключаться пользователем в скобки). За именем функции следует список параметров (возможно пустой), за ним косая черта не обязательна, и имена одного или более локальных символов для функции. Последний параметр (если таковой имеется) и первый локальный символ должны быть отделены косой чертой или хотя бы одним пробелом.

Если не объявляются ни параметры, ни локальные символы, после имени функции должны быть пустые круглые скобки. Например:

(defun myfunc (x y)...) (функция принимает 2 параметра)

(defun myfunc (/a b)...) (функция имеет 2 локальных символа)

(defun myfunc (x/temp)...) (один параметр и один локальный символ)

(defun myfunc ()...) (нет параметров и локальных символов)

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

Сама функция DEFUN вводит имя определенной функции. Если вызвана определенная таким образом функция, ее параметры будут вычислены и ограничены (подогнаны) параметрами символов. Локальные символы могут применяться в функции без изменения их связи на внешних уровнях. После вычисления результата последнего выражения, функция будет введена. Все предыдущие выражения в функции имеют побочный эффект. Сама функция DEFUN вводит имя определенной функции. Например:

(defun add (x y)

(+ x y)

)

(add 10 5) вводит 15

(add -7 . 4) вводит 2,60000

и

(defun dots ( x y/temp)

(setq temp (strcat x "..."))

(strcat temp y)

)

(dots "a" "b" ) вводит "а...b"

(dots "from" "to") вводит "from...to"

Никогда не применяйте имя встроенной функции или символа в качестве <sym>, поскольку это сделает встроенную функцию недоступной.

4.37.1. Функции библиотек и автоматическая загрузка

Определения функций могут храниться в файле и загружаться при помощи функции LOAD АвтоЛИСПа (эта функция описана дальше в этой главе). Если существует файл "acad.lsp", АвтоЛИСП будет загружать его автоматически каждый раз при введении графического редактора АвтоКАДа; вы можете применять эту функцию для создания библиотеки полезных функций и для создания гарантии присутствия этой библиотеки.

4.37.2. Функции С:ххх - дополнение команд АвтоКАДа

Вы можете ввести дополнительные команды в АвтоКАД, применяя функцию DEFUN для определения функций, вводящих в работу эти команды. Для того, чтобы применяться как команды АвтоКАДа, эти функции должны придерживаться следующих правил:

1. Функция должна иметь имя следующей формы: "С:ХХХ", где все буквы - верхнего регистра. Часть имени "С" должна присутствовать всегда, часть "ХХХ" может быть именем команды по вашему выбору, при условии, что она не дублирует никаких команд АвтоКАДа, встроенных или внешних.

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 вводит результат только последнего вычисленного выражения.