АвтоЛИСП - реализация языка программированияРефераты >> Программирование и компьютеры >> АвтоЛИСП - реализация языка программирования
"ошибка:забракованная АвтоКАДом функция" и выполнение функции прекращается. Если ввод пользователя необходим, заранее задайте функции GETxxx, как указано выше, или поместите их между удачными вызовами функции COMMAND.
Если команда АвтоКАДа выполняется и строка,состоящая из единичного мертвого хода ("/"), просчитывается как один из параметров функции COMMAND, эта функция приостановит прямой ввод пользователя (или смещение). Это идентично механизму паузы мертвого хода, которым снабжены меню. Однако, поскольку мертвый ход является специальным контрольным знаком в ЛИСПе, требуется два символа мертвого хода для того, чтобы получить один в текстовой строке.
Если вы выдаете промежуточные команды в то время, когда функция COMMAND приостановлена, она и остается приостановленной. Тем не менее, вы можете выполнять команду ZOOM или PAN во время паузы функции COMMAND. Пауза сохраняется до тех пор, пока АвтоКАД получает действительный ввод и в работе нет никаких промежуточных команд.
Например:
(command "circle" "5,5" "r" "\\" "line" "5,5" "7,5" "")
начинает команду 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. Функция должна иметь имя следующей формы: "С:ХХХ", где все буквы - верхнего регистра. Часть имени "С" должна присутствовать всегда, часть "ХХХ" может быть именем команды по вашему выбору, при условии, что она не дублирует никаких команд АвтоКАДа, встроенных или внешних.