АвтоЛИСП - реализация языка программированияРефераты >> Программирование и компьютеры >> АвтоЛИСП - реализация языка программирования
Необязательный параметр <string> функции 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/<number>:"))
(cond((eqx "Pi") pi)
((eq x "Two-pi")(*2.0 pi))
(T x)
)
)
Этот INITGET запрещает нулевой ввод и создает список из двух ключевых слов "Pi" и "TWO-Pi". Затем применяется GETREAL для получения целых чисел, издавая подсказку "Pi/Two-pi/<number>:", результат перемещения в локальном символе Х.
Если пользователь вводит число, это число возвращается функцией GETNUM. Однако, если пользователь вводит ключевое слово "Pi" ( или просто "P"), функция GETPOINT возвращает ключевое слово "Pi". Функция COND обнаруживает это и, в данном случае, вводит значение Pi. Ключевое слово "Two-pi" обрабатывается аналогично. Созданные с помощью INITGET контрольные пометки и ключевые слова применяются только со следующим GETxxx вызовом, а затем автоматически отбрасываются. Это позволяет очистить специальный режим при необходимости вызова другой функции.
4.61.(inters <pt1><pt2><pt3><pt4>[<onseq>])
Функция INTERS исследует две линии и вводит точку их пересечения, или ноль, если они не пересекаются. <pt1> и <pt2> - конечные точки первой линии, а <pt3> и <pt4> - конечные точки второй линии. Если присутствует необязательный параметр <onseq> и он равен нулю, линии считаются бесконечными по длине, INTERS вводит точку пересечения даже если она находится вне конца одной или обеих линий. Если параметр <onseq> опущен или он - ноль, точка пересечения должна находиться на обеих линиях или 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 <int>)
Эта функция вводит переход целых чисел в строку. Например:
(itoa 33) вводит "33"
(itoa -17) вводит "-17"
4.63 (lambda <arguments><expr> .)
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<list>)
Эта функция вводит последний элемент <списка>. <Список> должен быть не нулевым. Например:
(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 <list>)
Эта функция вводит целое число, обозначающее номер элемента в <списке>. Например:
(length '(a b c d) вводит 4
(length '(a b (c d)) вводит 3
(length '()) вводит 0
4.66.(list <expr> .)
Эта функция берет любое количество выражений (<expr>) и соединяет их вместе, вводя список. Например:
(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 <item>)
Эта функция вводит T, если <item> - список, и nil в противном случае. Например:
(listp '(a b c)) вводит T
(listp 'a) вводит nil
(listp 4.343) вводит nil
4.68.(load <filename>)
Эта функция загружает файл выражений АвтоЛИСПа и вычисляет эти выражения. <filename> - строка, которая представляет имя файла без расширения (расширение ".lsp" допускается). <filename> может включать префикс с каталогом, как в "/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/), пока не активна никакая другая функция ЛИСПа.