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

)

Эта функция вводит расстояние между 2D точками

и

, где 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 )

Эта функция определяет, идентичны ли и , то есть, они фактически граничат с одним и тем же объектом (например,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 )

Эта функция определяет, равны ли и , т.е. вычисляются ли они к одному предмету. Например, заданы следующие назначения:

(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 )

Вводит результат вычисленных (выражений), где - любое выражение ЛИСПа. Например, заданы назначения:

(setq a 123)

(setq b 'a)

тогда:

(eval 4.0) вводит 4.000000

(eval (abs - 10 )) вводит 10

(eval a) вводит 123

(eval b) вводит 123

4.42.(exp )

Эта функция вводит е, возведенное в степень (обычный антилогарифм (antilog)). Она вводит действительные числа. Например,

(exp 1.0) вводит 2.718282

(exp 2.2) вводит 9.025013

(exp -0.4) вводит 0.670320

4.43. (expt

)

Эта функция вводит , возведенную в определенную . Если оба параметра целые числа, результат будет целым числом. В противном случае, результат будет действительным числом. Примеры:

(expt 2 4) вводит 16

(expt 3.0 2.0) вводит 9.000000

4.44. (fix )

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

(fix 3) вводит 3

(fix 3.7) вводит 3.000000

4.45.(float )

Эта функция вводит преобразование в действительное число. может быть как целым, так и действительным. Например:

(float 3) вводит 3.000000

(float 3.7) вводит 3.700000

4.46.(foreach )

Эта функция проходит через , присваивая каждому элементу и вычисляет каждое . Любое количество может быть определено. FOREACH вводит результат вычисления последнего . Например:

(foreach n'(a b c)(print n))

эквивалентно

(print a)

(print b)

(print c)

кроме того FOREACH вводит результат только последнего вычисленного выражения.

4.47.(gcd )

Эта функция вводит наибольший общий знаменатель и . и должны быть целыми. Например:

(gcd 81 57) вводит 3

(gcd 12 20) вводит 4

4.48.(getangle [

][

]

Для пользователя эта функция приостанавливает ввод угла. - произвольная строка, которая появляется на экране в качестве подсказки, а

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

Вы можете также "показать" АвтоЛИСПу угол, отмечая точками два 2D расположения на экране графики. АвтоКАД рисует линию резиновой нити от первой точки до позиции текущего перекрестия, что поможет вам при визуализировании угла.

Необязательный параметр

функции 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

[

])

Функция GETCORNER вводит точку так же, как и GETPOINT. Однако, GETCORNER требует параметр точки и чертит прямоугольник из точки по мере перемещения пользователем пересечения на экране. Для детального ознакомления см. GETPOINT и INITGET. В качестве ответа на требование GETCORNER, вы не можете ввести другое выражение ЛИСПа.

4.50.(getdist [

][

])

Для пользователя эта функция приостанавливает ввод расстояния. - произвольная строка, которая появляется на экране в качестве подсказки, а

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

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

функции GETDIST (если он определен) предполагается быть первой из этих двух точек, позволяя вам "показать" АвтоЛИСПу расстояние, отмечая еще одну точку.

Следующие примеры иллюстрируют применение GETDIST.

(setq dist (getdist))

(setq dist (getdist '(1.0 3.5))

(setq dist (getdist "How far?")

(setq dist (getdist '(1.0 3.5)"How far?")

Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование GETDIST. См. также INITGET.

4.51.(getint[

])

Для пользователя эта функция приостанавливает ввод целых чисел и возвращает это целое число. - произвольная строка, которая появляется на экране в качестве подсказки.

Например:

(setq num (getint))

(setq num (getint "Enter a number:")) (Введите число)

Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование GETINT. См. также INITGET.

4.52.(getkword [

])

Функция GETKWORD требует от пользователя ключевого слова. Перед вызовом GETKWORD, устанавливается список действительных ключевых слов, применяя функцию INITGET (описанную ниже). GETWORD вводит ключевое слово, выравнивая в строку ввод пользователя. АвтоКАД повторит попытку, если ввод не соответствует одному из этих ключевых слов. Пустой (нулевой) ввод введет нуль (если это допустимо). Нуль также вводится, если создана строка ключевых слов. Например:

(initgent 1 "Yes Nо")

(setq x (getkword "Are you sure? (Yes or No)"))

подскажет пользователю и установит символ Х как для "Yes", так и для "No", в зависимости от ответа пользователя. Если подсказка не соответствует ни одному из ключевых слов, или если пользователь отвечает нулем, АвтоКАД попросит пользователя повторить процедуру.

Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование GETKWORD. См. также INITGET.

4.53.(getorient [

][

])

В АвтоЛИСПе углы всегда представлены в радианах, с направлением в ноль-радиан вправо ( восток) и углом, увеличивающимся в направлении против часовой стрелки. Таким образом, будут иметь место некоторые преобразования, если пользователь выберет различные нуль-градусные базы или различные направления для увеличения угла посредством команды INITS или систем переменных ANGBASE и ANGDIR.

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

Представьте, что команда АвтоКАДа INITS применялась для выбора нуль-градусной базы 90 градусов (север) и направления для увеличения угла - по часовой стрелке. В таблице показано, что введут функции GETANGLE и GETORIENT (в радианах) для репрезентивного ввода переменных пользователем (в градусах).

Input (degrees)

GETANGLE

GETORIENT

0

0.000000

1.570796

90

1.570796

3.141593

180

3.141593

4.712389

90 (-90 270?)

4.712389

0.000000

Как показано в таблице, GETANGLE принимает на обработку направление увеличения угла, но игнорирует ноль-градусную базу. Таким образом, вы можете применять GETANGLE для получения величины вращения при вводе/вставке блока, так как ввод нуль-градуса всегда введет ноль радиан. С другой стороны, GETORIENT принимает на обработку как ноль-градусную базу, так и направление увеличения угла. Таким образом, вы должны применять GETORIENT для получения таких углов, как угол базовой линии для Элемента Текста. Например, для заданных выше установок UNITS, ориентация базовой линии для нормальной горизонтальной линии текста будет 90 градусов.

Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование GETORIENT. См. также GETANGLE и INITGET.

4.54. (getpoint [

] [

])

Для пользователя эта функция приостанавливает ввод точки.

- необязательная базовая точка, а

- произвольная строка, которая появляется на экране в качестве подсказки. Вы можете определить точку поинтером или напечатав координату в текущем формате единиц. Если присутствует параметр необязательной базовой точки

, АвтоКАД чертит линию резиновой нити от этой точки до позиции текущего перекрестия. Например:

(setq p (getpoint))

(setq p (getpoint "Where?")) "Где?"

(setq p (getpoint '(1.5 2.0) "Second point:")

Обычно GETPOINT вводит точку 2D (список из двух действительных чисел). Применяя функцию INITGET для установки контрольной отметки "точка.3D", вы можете заставить GETPOINT ввести точку 3D (список из трех действительных чисел).

Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование GETPOINT. См. также GETCORNER и INITGET.

4.55.(getreal [

])

Для пользователя эта функция приостанавливает ввод действительного числа и возвращает это действительное число. - произвольная строка, которая появляется на экране в качестве подсказки. Например:

(setq val (getreal)

(setq val (getreal "фактор шкалы:")

Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование GETREAL. См. также INITGET.

4.56.(getstring [][

])

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

(setq s (getstring))

(setq s (getstring "What's your first name?"))

(setq s (getstring T "What's your full name?"))

Если ввод пользователя должен быть одной из нескольких опций (ключевых слов), вместо GETSTRING может применяться описанная ранее функция GETKWORD.

Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование GETSTRING.

4.57.(getvar )

Эта функция отыскивает значения системных переменных АвтоКАДа. Имя переменной дожно быть заключено в двойные кавычки "". Например, предположим, что самый последний из определенных нами радиус округления был 0.25 единиц:

(getvar "FILLETRAD") введет 0.250000

Список текущих системных переменных АвтоКАДа можно найти в приложениях А книги пользователя АвтоКАДа. См. также функцию SETVAR.

4.58.(graphscr)

Функция GRAPHSCR переключается с текстового экрана на графический в одно-экранных системах (типа функциональной клавиши "Flip screen" в АвтоКАДе). GRAPHSCR всегда вводит ноль. См. также функцию TEXTSCR.

4.59.(if )

Эта функция условно вычисляет выражения. Если не ноль, тогда она вычисляет , в противном случае она вычисляет . Последнее выражение () - необязательное. IF вводит значение выбранного выражения; если пропущено, а равно нулю, IF вводит ноль. Например:

(if (=1 3)"Yes!!" "No") вводит "No"

(if (=2 (+1 1)) "Yes!!") вводит "Yes!!"

(if (=2 (+3 4)) "Yes!!") вводит nil

4.60.(initget [][])

Эта функция создает различные опции для дальнейшего использования их функцией GETxxx (кроме GETSTRING и GETVAR). INTGET всегда вводит ноль. Необязательный параметр - целое число со следующими значениями:


INITGET Bits

Значение

1

не допускает нулевой ввод

2

не допускает нулевые значения

4

не допускает отрицательных значений

8

не проверяет границы,даже если действует limcheck

16

вводит точки 3D раньше,чем точки 2D

Биты могут складываться вместе в любой комбинации для создания значений от 0 до 31. Если пользователь при вводе определенных режимов ошибается (например, вводит нулевое значение, когда оно не допускается), АвтоКАД выдаст на экран сообщение и попросит пользователя повторить попытку. Например:

(initget (+ 1 2 4))

(setq age (getint "How old are you?") : возраст "Сколько вам лет?"

получит возраст пользователя, автоматически повторив попытку, если пользователь введет ноль, отрицательное число или нулевое значение. Если параметр не задан, предполагается ноль (нет режимов). Специальные контрольные значения принимаются на обработку только теми функциями GETxxx, для которых они имеют смысл (как показано в таблице):

Функция

INITGET control bits honored (принимаемые на обработку контрольные байты функции INITGET)


No null

No zerro

No neg.

No limits

3D hoints

GETINT

·

·

·



GETREAL

·

·

·



GETDIST

·

·

·



GETANGLE

·

·

·



GETORIENT

·

·

·



GETPOINT

·



·

·

GETCORNER

·



·

·

GETKWORD

·





GETSTRING






GETVAR






Необязательный параметр функции INITGET определяет список ключевых слов опции, которые будут проверены следующими требованиями GETxxx, если пользователь не ввел ожидаемый тип данных ввода (например, точку для GETPOINT). Если ввод пользователя соответствует одному из ключевых слов этого списка, это ключевое слово вводится с помощью функции GETxxx как результат функции STRING. Программа пользователя может контролировать ключевые слова и выполнять желаемые действия для каждого из них. Если ввод пользователя не ожидаемого типа и не соответствует ни одному из ключевых слов, АвтоКАД попросит повторить попытку. Список ключевых слов должен быть следующей формы: "KEY1 KEY2 KEY3 ABBREV3". Отдельные ключевые слова определены пробелами. Сокращения (аббривиатура) необязательны, есть два метода их определения.

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

Например: "LTYPE,LT" и "LType" - эквивалентные спецификации. Каждая означает, что вводы пользователя типа "LTYPE", "LTYP", "LTY" или "LT" применяемы, но "L"- недостаточно, а "LTSCALE" и "LTYPEX" не соответствуют.

Рассмотрим следующие, определенные пользователем функции

(defun getnum (ix)

(initget 1 "Pi Two-pi")

(setq x (getreal "Pi/Two-pi/:"))

(cond((eqx "Pi") pi)

((eq x "Two-pi")(*2.0 pi))

(T x)

)

)

Этот INITGET запрещает нулевой ввод и создает список из двух ключевых слов "Pi" и "TWO-Pi". Затем применяется GETREAL для получения целых чисел, издавая подсказку "Pi/Two-pi/:", результат перемещения в локальном символе Х.

Если пользователь вводит число, это число возвращается функцией GETNUM. Однако, если пользователь вводит ключевое слово "Pi" ( или просто "P"), функция GETPOINT возвращает ключевое слово "Pi". Функция COND обнаруживает это и, в данном случае, вводит значение Pi. Ключевое слово "Two-pi" обрабатывается аналогично. Созданные с помощью INITGET контрольные пометки и ключевые слова применяются только со следующим GETxxx вызовом, а затем автоматически отбрасываются. Это позволяет очистить специальный режим при необходимости вызова другой функции.

4.61.(inters

[])

Функция INTERS исследует две линии и вводит точку их пересечения, или ноль, если они не пересекаются.

и

- конечные точки первой линии, а

и

- конечные точки второй линии. Если присутствует необязательный параметр и он равен нулю, линии считаются бесконечными по длине, INTERS вводит точку пересечения даже если она находится вне конца одной или обеих линий. Если параметр опущен или он - ноль, точка пересечения должна находиться на обеих линиях или INTERS введет ноль. Например, задано:

(setq a'(1.0 1.0) b'(9.0 9.0))

(setq c'(4.0 1.0) d'(4.0 2.0))

тогда:

(inters a b c d) введет nil

(inters a b c d T) введет nil

(inters a b c d nil)введет (4.000000 4.000000)

4.62.(itoa )

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

(itoa 33) вводит "33"

(itoa -17) вводит "-17"

4.63 (lambda ...)

LAMBDA определяет "анонимную" функцию. Обычно она применяется когда заголовок при определении новой функции не выравнен. Она также помещает функцию на то место, где она должна применяться. LAMBDA вводит значение последнего и часто применяется вместе с APPLY и/или MAPCAR для выполнения функции в списке. Например:

(apply '(lambda (x y z)

(* x (-y z)

)

'(5 20 14)

) вводит 30

или:

(mapcar '(lambda (x)

(setq counter (1 + counter))

(* x 5)

)

'(24 -6 10.2)

) вводит (10 20 -30 51.000000)

4.64.(last)

Эта функция вводит последний элемент . должен быть не нулевым. Например:

(last '(a b c d e)) вводит E

(last '(a b c (d e))) вводит (DE)

Как показано, LAST может вводить как атом, так и список. На первый взгляд может показаться,что LAST- отличный способ получения координаты Y точки. Пока это истинно для 2D точки (список из двух действительных чисел), LAST введет координату Z для 3D точки. Для того,чтобы ваша функция работала как следует, задавая точки 2D и 3D, мы советуем вам применять CADR для получения координаты Y и CADDR для получения координаты Z.

4.65.(length )

Эта функция вводит целое число, обозначающее номер элемента в . Например:

(length '(a b c d) вводит 4

(length '(a b (c d)) вводит 3

(length '()) вводит 0

4.66.(list ...)

Эта функция берет любое количество выражений () и соединяет их вместе, вводя список. Например:

(list 'a 'b 'c) вводит (A B C)

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

(list 3.9 6.7) вводит (3.90000 6.70000)

В АвтоЛИСПе эта функция часто применяется для определения переменных точек 2D и 3D (список из двух или трех действительных чисел).

4.67. (listp )

Эта функция вводит T, если - список, и nil в противном случае. Например:

(listp '(a b c)) вводит T

(listp 'a) вводит nil

(listp 4.343) вводит nil

4.68.(load )

Эта функция загружает файл выражений АвтоЛИСПа и вычисляет эти выражения. - строка, которая представляет имя файла без расширения (расширение ".lsp" допускается). может включать префикс с каталогом, как в "/function/test1" ("функция/тест 1"). В системах MS-DOS/PC-DOS также допускается имя накопителя (например, a: c:) и вы можете использовать мертвый ход вместо предшествующей косой черты (но помните, что вы должны применять "\\" для получения одной косой черты в строке).

Если операция удачна, LOAD вводит имя последней определенной в файле функции. Если операция дает сбой, LOAD введет имя файла в виде строки.

Например, предположим, что файл "/fred/test1.lsp" содержит DEFUN функции MY-FUNС, а файл "test2.lsp" не существует:

(load "/fred/test1") вводит MY-FUNC

(load "test2" вводит "test"

Функция LOAD не может быть вызвана внутри другой функции ЛИСПа. Она должна быть введена непосредственно с клавиатуры (или из меню, или файла сценария /script file/), пока не активна никакая другая функция ЛИСПа.

Каждый раз, когда начинается сеанс работы графического редактора АвтоКАДа, АвтоЛИСП загружает файл "acad.lsp", если он существует. Вы можете записать на этот файл определение или наиболее часто употребляемые команды, они будут вычисляться автоматически каждый раз, когда вы начнете редактировать чертеж.

4.69.(log )

Эта функция вводит в виде действительного числа естественный log . Например:

(log 4.5) вводит 1.504077

(log 1.22) вводит 0.198850

4.70.(logand ...)

Эта функция вводит результат логического подразрядного AND/И списка . должны быть целыми, результат также будет целым числом. Например:

(logand 7 15 3) вводит 3

(logand 2 3 15) вводит 2

(logand 8 3 4) вводит 0

4.71.(logior )

Эта функция вводит результат логического подразрядного включающего OR/ИЛИ списка . должны быть целыми, результат будет также целым числом. Например:

(logior 1 2 3) вводит 7

(logior 9 3) вводит 11

4.72.(lsh )

Эта функция вводит логическое подразрядное смещение битами . и должны быть целыми числами, результат также целое число. Если положительное число, смещается влево, если отрицательное - вправо. В обоих случаях "нулевые" биты смещаются внутрь, а биты, сдвигаемые наружу без сохранения выдвигаемых разрядов, не учитываются (shift in/shift out). Если "один" бит смещен внутрь или наружу (into/out) от вершины (16-ого ) бита целого числа, его знак меняется. Например:

(lsh 2 1) вводит 4

(lsh 2 -1) вводит 1

(lsh 40 2) вводит 160

(lsh 16384 1) вводит -32768

4.73.(mapcar ...)

MAPCAR вводит результат выполненной с индивидуальными элементами через , подаваемые как параметры . Количество должно соответствовать количеству параметров, требуемых . Например:

(mapcar '1+'(10 20 30) вводит (11 21 31)

Это эквивалентно

(1 + 10)

(1 + 20)

(1 + 30)

Кроме этого MAPCAR вводит список результатов. Аналогично:

(mapcar '+'(10 20 30)'(4 3 2) вводит (14 23 32)

эквивалентно:

(+10 4)

(+20 3)

(+30 2)

Функция LAMBDA может определить "анонимную" функцию, которую выполнит MAPCAR. Это полезно, когда некоторые параметры функции - константы или подаются некоторыми другими путями. Например:

(mapcar '(lambda (x)(+ x 3))'(10 20 30) вводит (13 23 33)

и

(mapcar '(lambda (x y z)

(* x (-y z)

)

'(5 6)'(20 30)'(145.0)

) вводит (30 150.000000)

4.47.(max ...)

Эта функция вводит самое большое из заданных . Каждое может быть действительным или целым. Например:

(max 4.07 -144) вводит 4.070000

(max -88 19 5 2) вводит 19

4.75.(member )

Эта функция ищет из имеющихся в наличии и вводит остаточные члены , начиная с первого, имеющегося в наличии . Если в нет нужных , MEMBER вводит ноль. Например:

(member 'c '(a b c d e) вводит (C D E)

(member 'q '(a b c d e) вводит nil

4.76.(menucmd )

Функция MENUCMD снабжает средствами программы для переключения между подстраницами в меню АвтоКАДа. Таким образом, программа ЛИСПа может работать во взаимодействии с объединенным файлом меню, каждый раз при необходимости ввода пользователя, выводя на экран соответствующие подменю варианты/альтернативы. Параметр функции MENUCMD имеет следующую форму:

section - submenu (секция - подменю)

где

section определяет секцию/раздел меню. Действительны следующие имена:

S - для меню экрана (SCREEN)

B - для клавишного меню (BUTTONS)

T1-T4 - для меню планшета (TABLET) от 1 до 4

A1 - для AUXI меню.

submenu определяет какое из подменю активно. Имя должно быть или одним из знаков/обозначений меню (без "**") в текущем загруженном файле меню, или именем секции основного меню. Для дальнейшей информации см. Главу 5. Обратите внимание, что начальная "S", применяемая для ссылки на подменю в файле меню, здесь не применяется. Например:

(menucmd "S = OSNAP")

вызовет на экран подменю "OSNAP" (предполагая, что такое подменю существует в текущем файле меню). Аналогично:

(menucmd "B" = "MY-BUTTONS")

определит "MY-BUTTONS" для кнопочного меню. MENUCMD всегда вводит nil.

4.77.(min ...)

Эта функция вводит самое маленькое из заданных . Каждое должно быть действительным или целым. Например:

(min 683 -10.0) вводит -10.000000

(min 73 2 48 5) вводит 2

4.78.(minusp )

Эта функция вводит T, если - действительное или целое число и вычисляется к отрицательному значению, иначе она вводит nil. Для других типов функция не определяется. Например:

(minusp -1) вводит T

(minusp -4.293) вводит T

(minusp 830.2) вводит nil

4.79.(not )

Эта функция вводит T, если выражение - нулевое и ноль в противном случае. Как правило, функция NULL применяется для списков, а NOT применяется для других типов данных в сочетании с некоторыми типами контроля функций. Например, заданы следующие назначения:

(setq a 123)

(setq b "string")

(setq c nil)

тогда:

(not a) вводит nil

(not b) вводит nil

(not c) вводит T

(not '()) вводит T

4.80.(nth )

Эта функция вводит "nth" элемент , где - номер вводимого элемента (нулевой - первый элемент). Если больше, чем задано в , вводится nil. Например:

(nth 3 '(a b c d e)) вводит D

(nth 0 '(a b c d e)) вводит A

(nth 5 '(a b c d e) вводит nil

4.81.(null )

Эта функция вводит Т, если близок к нулю, иначе она введет nil. Например, заданы следующие назначения:

(setq a 123)

(setq b "string")

(setq c nil)

тогда:

(nul a) вводит nil

(nul b) вводит nil

(nul c) вводит T

(nul '()) вводит T

4.82.(numberp )

Эта функция вводит T, если - целое или действительное число, иначе она вводит ноль. Например, заданы назначения:

(setq a 123)

(setq b 'a)

тогда:

(numberp 4 ) вводит T

(numberp 3.8348) вводит T

(numberp "Howdy") вводит nil

(numberp 'a) вводит nil

(numberp a) вводит T

(numberp b) вводит nil

(numberp (eval b)) вводит T

4.83.(open )

Эта функция открывает файл для обращения к нему I/O функции АвтоЛИСПа. Она вводит дескриптор файла, который будет применяться другими I/O функциями, поэтому он должен начинаться с setq. Например:

(setq a(open "file.ext" "r"))

- строка, определяющая имя и расширение открываемого файла. - пометка для чтения/написания. Он должен быть в виде строки, состоящей их единичных букв нижнего регистра. Действительные для mode буквы описаны в следующей таблице:

ОPEN mode

Описание

"r"

Открыт для чтения. Если не существует, вводится ноль

"w"

Открыт для написания. Если не существует, создается и открывается новый файл. Если существует, его существующие данные перепишутся.

"a"

Открыт для дополнений. Если не существует, создается и открывается новый файл. Если уже существует, он открывается и дополняется позиция в конце существующих данных, так любые новые данные, записанные в файл, будут добавлены к существующим данным.

В системах DOS, некоторые программы и текстовые редакторы записывают файлы текста с маркером конец-файла (CTRL Z, десятичный ASCII код 26) в конце текста. При прочтении текстового файла DOS вводит статус конец-файла, если имеется маркер CTRL Z , даже если после него имеются еще данные. Если вы намерены применять "a" режим функции OPEN для дополнения данных в файл созданный другой программой, проверьте, чтобы другая программа не использовала маркер CTRL Z в конце своих текстовых файлов.

Представьте, что в данных примерах имен файлов не существует:

(setq f(open "new.tst" "w")) вводит

(setq f(open "nouch.fil" "r")) вводит nil

(setq f(open "logfile" "a")) вводит

может содержать прямой префикс, как в "test/func3" В системах MS-DOS также допускается управляющая буква; вы можете использовать обратную косую черту вместо прямой черты (но помните, что вы должны применять "\\" для получения в строке одной косой черты). Например:

(setq f(open "/x/new.tst" "w") вводит

(setq f(open nosuch.fil" "r") вводит nil

4.84.(or ..)

Эта функция вводит логическое OR/ИЛИ для списка выражений. Если все выражения вычисляются к нулю ИЛИ вводит ноль, в противном случае вводит Т. Например:

(or nil 'a '()) вводит T

(or nil '()) вводит nil

4.85.(osnap

)

Эта функция вводит точку, которая является результатом применения режимов фиксации (snap) объекта, описанного к точке

. - строка, состоящая из одного или более действительных зафиксированных объектов, определенные как "midpoint", "center" и т.д., отделенные запятыми. Например:

(setq pt2 (osnap pt1 "midp"))

(setq pt2 (osnap pt1 "midp,endp,center")

Если параметр

-точка 2D (список из двух действительных чисел), вводится точка 2D. Если параметр

точка 3D (список из трех действительных чисел), вводится точка 3D. Если в оснапе не находится точки, определенной /режимом, для заданной точки

, вводится ноль.

4.86. pi

Это не функция, а константа pi. Она вычисляется приблизительно 3,1415926.

4.87.(polar

)

Эта функция вводит точку под углом на расстоянии от точки

. Точка - список из двух действительных чисел, угол выражен в радианах. Например:

(polar '(1.0 1.0) 0.785398 1.414214)

вводит (2.000000 2.000000)

4.88. (prin1[])

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

(setq a 123)

(setq b '(a))

тогда

(prin1 'a) печатает A и вводит A

(prin1 a) печатает 123 и вводит 123

(prin1 b) печатает (A) и вводит (A)

(prin1 "Hello") печатает "Hello" и вводит "Hello"

Каждый из примеров печатается на экране, как только определяется . Представьте, что F - действительный дескриптор файла, открытого для написания:

(prin1 "Hello" f)

напишет "Hello" в заданный файл и введет "Hello".

Если - строка, содержащая контрольные символы, PRIN1 отредактирует эти символы кавычками " ".

\e для escape переход

\n для newline новая линия

\r для return возврат,ввод

\t для tab табуляция

\nnn для символов,чей восьмиричный код nnn

Таким образом:

(prin1 (chr 2)) печатает "\002" и вводит "\002"

(prin1 (chr 10)) печатает "\n" и вводит "\n"

4.89.(princ [])

Эта функция такая же, как PRIN1, кроме того, что контрольные символы в печатаются без расширения. В общем, PRIN1 разработан для написания выражений в таком виде, чтобы они были совместимы с функцией LOAD , в то время как PRINC будет печатать их в пригодном для чтения функцией READ-LINE виде.

4.90. (print [])

Эта функция такая же, как PRIN1, кроме того, что новые линии печатаются перед , а в промежутке печатается следующее выражение.

4.91. (progn ...)

Эта функция последовательно вычисляет каждое и вводит значение последнего выражения. Вы можете применять PROGN для вычисления нескольких выражений, где предусматривается только одно выражение. Например:

(if (=a b) (progn

(setq a (+a 10)

(setq b (-b 10)

)

Функция IF нормально вычисляет одно выражение "then", если тестовое выражение вычисляется к чему-либо отличному от нуля. В этом примере мы применяли PROGN для вычисления двух выражений вместо первоначального.

4.92.(prompt )

Эта функция высвечивает на экране в зоне подсказок /сообщение и вводит ноль. - строка. В двухэкранной конфигурации АвтоКАДа, функция PROMPT высвечивает на обоих экранах и поэтому предпочтительна для PRINC. Например:

(prompt "New value:")

на экранах появится "New value:" и вводится ноль.

4.93.(quote )

Вводит невычисляемое . Она также может быть записана следующим образом:

'expr

Например:

(quote a) вводит A

(quote cat) вводит CAT

(quote (a b)) вводит (A B)

'a вводит A

'cat вводит CAT

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

4.94. (read )

Эта функция вводит первый перечень или атом, полученные из . не должна содержать пробелов. Например:

(read "hello") вводит HELLO

(read "hi") вводит HI

(read "(a)") вводит (A)

4.95.(read-char [])

Эта функция читает единичный символ из буфера ввода клавиатуры или из открытого файла, описанного в . Она вводит (целое число) ASCII код, представляющий возможность прочесть символ.

Если не определен, а в буфере ввода клавиатуры нет символов, READ-CHAR ждет, пока вы что-либо напечатаете с клавиатуры (сопроводжая запись клавишей RETURN !). Например, предположим, что буфер ввода клавиатуры пуст:

(read-char)

будет ждать, чтобы что-то было введено. Если вы напечатаете "A B C", а затем нажмете RETURN, READ-CHAR введет 65 (код ASCII для буквы "A"). На следующие вызовы READ-CHAR введет 66, 67 и 10 (новая линия) соответственно. Если затем будут произведены следующие вызовы READ-CHAR, она опять будет ждать ввод.

4.96. (read-line [])

Эта функция читает строку с клавиатуры или из открытого файла, описанного в . Если конец файла не вычисляется, READ-LINE вводит ноль, в противном случае она вводит строку, которая была прочитана. Предположим, что F - действительный поинтер открытого файла:

(read-line f)

введет следующую входную линию из файла, или ноль, если был достигнут конец файла.

4.97 (redraw [[]])

Эффект функции зависит от количества заданных параметров. Если вызов без параметров,

(redraw)

он перерисует весь чертеж, как команда АвтоКАДа REDRAW. Если вызов с параметром имени объекта,

(redraw )

перечерчен будет выбранный объект. Это полезно при определении объекта на экране после применения GRCLEAR для очистки экрана.

Завершение контроля над перечерчиванием объекта осуществляется вызовом REDRAW с двумя параметрами:

()

где - имя объекта, который будет перечерчен, а - целое число с одним из следующих значений:

Redraw Mode

Action/действие

1

Перечертить объект на экране

2

Уничтожить объект (внести пробелы)

3

Высвечивание объекта (если позволяет дисплей)

4

Отмена высвечивания объекта (если позволяет дисплей)

Если - заголовок или комплексный объект (Полилиния или Блок с дополнениями), главный объект и все его подобъекты будут отрабатываться, если параметр положительный. Если параметр отрицательный, управляемый функцией REDRAW будет только один заголовок. Если ошибок нет, REDRAW всегда вводит ноль.

4.98.(rem ...)

Эта функция делит на и вводит остаток ( вычисляет остаток ). mod mod - модуль операция вычисления остатка.

REM может применяться с действительными и целыми числами со стандартными правилами перевода. Например:

(rem 42 12) вводит 6

(rem 12.0 16) вводит 12.000000

(rem 60 3) вводит 0

4.99.(repeat ...)

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

(setq a 10)

(setq b 100)

тогда:

(repeat 4

(setq a(+ a 10)))

(setq b(+ b 10)))

) вводит 140

4.100.(reverse )

Эта функция вводит с зарезервированными элементами. Например:

(reverse '((a)b c)) вводит (C B (A))

4.101. (rtos [

])

Эта функция вводит строку, которая является представлением (действительного) согласно с установками / режим и

/точность и переменной, задающей размеры АвтоКАДа DIMZIN. и - целые числа, которые выбирают линейные элементы режима и точности. Ниже перечислены обеспеченные значения :

RTOS Режим

Редактируемый формат

1

Научный

2

Десятичный

3

Прикладной (футы и десятичные дюймы)

4

Архитектурный (футы и дробные дюймы)

5

Производные дробные элементы

Параметры и

соответствуют системе переменных LUNITS и LUPREC АвтоКАДа. Если вы пропускаете параметры, будут применяться текущие установки LUPREC и LUNITS. Примеры RTOS:

(rtos 17.5 1 4) вводит "1.7500E+01"

(rtos 17.5 2 2) вводит "17.50"

(rtos 17.5 3 2) вводит "1'-5.50""

(rtos 17.5 4 2) вводит "1'-5 1/2""

(rtos 17.5 5 2) вводит "17 1/2"

Глава 5. Разработка интерфейсов пользователя


Информация о работе «АвтоЛИСП - реализация языка программирования»
Раздел: Информатика, программирование
Количество знаков с пробелами: 92410
Количество таблиц: 6
Количество изображений: 0

Похожие работы

Скачать
138339
34
32

... для загрузки конвейера (зав. № 1) крупнокусковой (более 450…550 мм) железной рудой с высоты 4,5 м. 11-12 ноября 1998 г. вопросы организации в г.Брянске серийного производства конвейеров с подвесной лентой конструкции ИПЦ «КОНВЕЙЕР» были рассмотрены и одобрены на проведенном в г. Губкин Белгородской обл. Международном семинаре-совещании специалистов предприятий, занимающихся производством ...

0 комментариев


Наверх