Смекни!
smekni.com

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

Например,заданы следующие назначения:

(setq pt1 '(5.0 1.33))

(setq pt2 '(2.4 1.33))

(setq a (angle pt1 pt2))

тогда:

(angtos a 0 0) вводит "180"

(angtos a 0 4) вводит "180.0000"

(angtos a 1 4) вводит "180d0'0"

(angtos a 3 4) вводит "3.1416r"

(angtos a 4 2) вводит "W"

4.18 (append <expr>...)

Эта функция берет любое количество элементов (<expr>/<выражений>) и соединяет их вместе в один перечень. Например

(append '(a b) '(c d)) введет (A B C D)

(append '((a)(b)) '((c)(d)) введет ((A)(B)(C)(D))

APPEND требует,чтобы ее параметры были в виде списков.

4.19 (apply <function> <list>)

Выполняет функцию, определенную <function>/<функцией> с параметрами, заданными в <list>/<списке>. Например:

(apply ' + '(1 2 3)) вводит 6

(apply 'stract' ("a" "b" "c")) вводит "abc"

APPLY работает как со встроенными (subrs), так и с определенными пользователем (эти создаются как с помощью DEFUN, так и LAMBDA) функциями.

4.20 (ascii <string>)

Эта функция вводит переход первого символа <строки> в ее знаковый код ASCII (целые числа). Это то же, что и функция ASC в языке БЕЙСИК. Например:

(ascii "A") вводит 65

(ascii "a") вводит 97

(ascii "BIG") вводит 66

4.21 (assoc <item> <alist>)

Эта функция ищет список ассоциаций <alist> для единицы (<item>) как ключевого элемента и вводит содержимое <alist>. Если <item> не найден как ключ в <alist>, ASSOC вводит ноль. Например, предположим, что список "al" определен как:

((name box) (width 3) (size 4.7263) (depth 5))

тогда:

(assoc 'size al) вводит (SIZE 4.7263)

(assoc 'weight al) вводит nil

Список ассоциаций часто используется для запоминания данных, которые могут выбираться как "ключ". Это похоже на матрицы и структуры в других языках программирования. Функция SUBST, описанная далее в этой главе, обеспечивает удобные способы отмены значений, ассоциируемые с одним ключем в перечне ассоциаций.

4.22 (atan <num1> [<num2>])

Если <num2> не задается, ATAN вводит арктангенс <num2> в радианах. <num1> может быть отрицательным, диапазон вводимых углов от -pt до +pt радиан. Например:

(atan 0.5) вводит 0.463647

(atan 1.0) вводит 0.785398

(atan -1.0) вводит -0.785398

(angtos (atan -1.0) 0 4) вводит "-45.0000"

Если заданы оба параметра (<num1> и <num2>), вводится арктангенс <num1>/<num2> в радианах. Если <num2> - ноль, вводится угол в плюс или минус 1.570796 радиан (90 или -90 градусов) в зависимости от знака <num1>. Например:

(atan 2.0 3.0) вводит 0.588002

(angtos (atan 2.0 3.0) 0 4) вводит "33.6901"

(atan 2.0 -3.0) вводит 2.553590

(angtos (atan 2.0 -3.0) 0 4) вводит "146.3099"

(atan -2.0 3.0) вводит -0.588002

(atan -2.0 -3.0) вводит -2.553590

(atan 1.0 0.0) вводит 1.570796

(angtos (atan 1.0 0.0) 0 4) вводит "90.0000

(atan -0.5 0.0) вводит -1.570796

(angtos (atan -0.5 0.0) 0 2) вводит "-90.00"

4.23 (atof <string>)

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

(atof "97.1") вводит 97.100000

(atof "3") вводит 3.000000

4.24 (atoi <string>)

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

(atoi "97") вводит 97

(atoi "3") вводит 3

(atoi "3.9) вводит 3

4.25 (atom <item>)

Эта функция вводит ноль, если <item> - список, в противном случае вводится T. Данные, поступающие не в виде строчек, проходят как atom. Например, даны выражения:

(setq a '(x y z))

(setq b 'a)

тогда:

(atom 'a) вводит T

(atom a) вводит nil

(atom 'b) вводит T

(atom b) вводит T

(atom '(a b c)) вводит nil

Некоторые варианты ЛИСПа различаются в своих интерпретациях ATOMа, так что поупражняйтесь в применении кода преобразования.

4.26 (Boole <func> <int1> <int2>...)

Это основная подразрядная булевая функция. <Func> - целое число от 0 до 15, представляющая одну из 16 возможных булевых функций на двух переменных. Последовательные параметры в виде целых чисел подразрядно (логически) скомбинированы, основываясь на этих функциях и истинностной таблице:

Int1 Int2 Func bit

---------------------

0 0 8

0 1 4

1 0 2

1 1 1

Каждый бит <int1> имеет пару соответствующего бита <int2>, выбирая один горизонтальный ряд истинностной таблицы. Бит результата или ноль, или 1, в зависимости от установки бита <func>, соответствующего этому ряду истиностной таблицы. Если соответствующий бит задан в <func>, бит результата 1, в противном случае бит результата - 0.

Некоторые значения для <func> эквивалентны стандартным булевым операциям AND, OR, XOR и NOT. Они представлены ниже:

Функция Операция Бит результата 1,если...

-------------------------------------------------------

1 AND оба входных бита - 1

6 XOR только один из двух входных битов - 1

7 OR любой или оба из входных битов

8 NOT оба входных бита - 0 (чье-то дополнение)

Например:

(Boole 1 12 5)

определяет логическое AND для значений 12 и 5. Результат 4. Аналогично:

(Boole 6 6 5)

определяет логическое XOR для значений 6 и 5,в результате - 3.

Вы можете применять другие значения <func> для выполнения других булевых операций, для которых эти имена не являются стандартными. Например, если <func> - 4 , биты результата заданы, если заданы соответствующие биты в <int2>, но не в <int1>. Таким образом:

(Boole 4 3 14)

введет 12.

4.27 (boundp <atom>)

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

(setq a 2)

(setq b nil)

тогда:

(boundp 'a) вводит T

(doundp 'b) вводит nil

4.28 caar, cadr, cddr, cadar, etc.

АвтоЛИСП обеспечивает связь CAR и CDR до четырех уровней вглубь. Например, задано назначение:

(setq x '((a b) c d))

тогда:

(caar x ) эквивалентно (car (car x)) вводит A

(cdar x) эквивалентно (cdr (car x)) вводит (B)

(cadar x) эквивалентно (car (cdr (car x))) вводит B

(cadr x) эквивалентно (car (cdr x)) вводит С

(cddr x) эквивалентно (сdr (сdr x)) вводит (D)

(caddr x) эквивалентно (car (cdr (cdr x))) вводит D

В АвтоЛИСПе CADR частично применяется для получения координаты Y для точек 2D и 3D ( второй элемент в списке из двух или трех действительных чисел). Аналогично, CADDR может применяться для определения координаты Z для точки 3D. Например:

(setq pt2 '(5.2 1.0 (2D точка)

(setq pt3 '(5.2 1.0 3.0) (3D точка)

тогда:

(car pt2) вводит 5.200000

(cadr pt2) вводит 1.000000

(caddr pt2) вводит nil

(car pt3) вводит 5.200000

(cadr pt3) вводит 1.000000

(caddr pt3) вводит 3.000000

4.29 (car <list>)

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

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

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

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

4.30 (cdr <list>)

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

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

(cdr '((a b) c)) вводит (C)

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

Когда параметры <списка> - разделенные точкой пары (см. ниже CONS), CDR вводит второй элемент без включения его в список. Например:

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

(cdr '(1 . "Text") вводит "Text"

4.31 (chr <number>)

Эта функция вводит переход целых чисел, представленных в знаковом коде ASCII, в однознаковую строку (аналогично функции CHRS в языке БЕЙСИК). Например:

(chr 65) вводит "A"

(chr 66) вводит "B"

(chr 97) вводит "a"

4.32 (close <file-desc>)

Эта функция закрывает файл и вводит ноль. <File-desc> - дескриптор файла (оприсатель), полученный из функции OPEN. После CLOSE дескриптор файла не изменяется, но становится недействительным. Например, представьте, что Х - действительный открытый дескриптор файла,

(close x )

закроет предполагаемый файл и введет ноль.

4.33 (command <arqs>...)

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

(setq pt1 '(1.45 3.23))

(setq pt2 (getpoint "Enter a point: "))

(command "line" pt1 pt2)

(command "")

Предполагая, что подсказка АвтоКАДа "Command" не выполняется, указанная выше последовательность выражений устанавливает значение для точки "pt1", выдает подсказку для точки "pt2" и выполняет команду АвтоКАДа LINE с двумя точками как данными ввода. Параметрами COMMAND могут быть строчки, действительные и целые числа или точки, как предусматри-вается последовательностью подсказки для выполнения команды АвтоКАДа. Нулевая строчка ("") эквивалентна печатанью пробела на клавиатуре. Вызов COMMAND без параметров эквивалентен печатанию CTR C на клавиатуре; это отменит большинство команд АвтоКАДа.

Команды, выполняемые из функции COMMAND, не отражаются на экране, если система переменных АвтоКАДа CMDECHO (выбранная из SETVAR или GETVAR) установлена на нуле. Функция COMMAND - основной метод выбора команд АвтоКАДа из АвтоЛИСПа.

Вводимые функции пользователя

"GETxxx" (GETANGLE, GETSTRING, GETINT, GETPOINT) не могут применяться внутри функции. Попытка проделать это, приведет в результате к появлению сообщения:

"ошибка:забракованная АвтоКАДом функция" и выполнение функции прекращается. Если ввод пользователя необходим, заранее задайте функции GETxxx, как указано выше, или поместите их между удачными вызовами функции COMMAND.

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

Если вы выдаете промежуточные команды в то время, когда функция COMMAND приостановлена, она и остается приостановленной. Тем не менее, вы можете выполнять команду ZOOM или PAN во время паузы функции COMMAND. Пауза сохраняется до тех пор, пока АвтоКАД получает действительный ввод и в работе нет никаких промежуточных команд.

Например:

(command "circle" "5,5" "r" "&bsol;" "line" "5,5" "7,5" "")