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 )

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

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

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

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

4.30 (cdr )

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

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

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

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

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

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

4.32 (close )

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

(close x )

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

4.33 (command ...)

Эта функция выполняет команду АвтоКАДа в пределах АвтоЛИСПа и всегда вводит ноль. Параметры, представляющие команды АвтоКАДа, и их подкоманды, каждый параметр высчитывается в АвтоКАД в качестве ответа на последующие подсказки. Имена команд и опции запускаются в виде строчек, точки 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" "\\" "line" "5,5" "7,5" "")

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

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

4.34 (cond ( ...)

Эта функция принимает в качестве параметров любое количество списков. Она вычисляет первый элемент каждого списка (в установленной последовательности) пока один из этих элементов введет значение, отличное от нуля. Затем она вычисляет те выражения, которые следуют за тестом, и вводит значение последнего выражения в подсписке. Если в подсписке только одно выражение (например, пропущен ),вводится значение выражения . 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 )

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

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

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

(cos 0.0 ) вводит 1.000000

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

4.37 (defun ...)

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

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

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

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


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

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

Скачать
138339
34
32

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

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


Наверх