Nil — Константа


Содержание

Константы и переменные Delphi

Работа с Delphi. Константы и переменные.

Константы — это параметры (объекты) программы, которые не могут из­менять своё значение в ходе выполнения программы.

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

Точно так же из любых символов мы можем составить символьные (один любой символ) и строковые константы (любое количество любых симво­лов, в том числе и ни одного). Такие константы заключаются в одинарные (не двойные!) кавычки:

’G’ ’R’ ’7’ ’Ж’ ’Э’ — символьные константы

’’ — пустая строка, в которой нет ни одного символа

’Delphi’ ’G’ ’Constant’ ’Строковая константа’ — строковые кон­станты

Строковые и символьные константы можно соединять знаком +:

’Delphi’ + ’ — ’ + ’ это наш выбор! ’

Значением этого выражения будет строка «Delphi- это наш выбор!»

’205’ ’14.007’ ’2 + 2’ — тоже строковые константы! Их значени­ями являются именно строки, а не числа, поэтому значение выражение ‘2 + 2’ вовсе не 4!

Если в строковой константе имеется одиночная кавычка, то её следует по­вторить дважды.

Кроме того, существуют логические константы True(соответствует зна­чению истина), False(ложь), а также константа nil (0, используется как значение указателей).

Такие явные константы и константные выражения можно использовать в любых операторах и для этого их не нужно объявлять.

Переменные — это параметры (объекты) программы, которые могут из­менять своё значение в ходе выполнения программы.

Физически переменная представляет собой область памяти (её размер за­висит от типа переменной; в этих ячейках памяти хранится значение пе­ременной), связанную с её идентификатором.

Как и все другие объекты программы, до первого использования перемен­ные должны быть объявлены. Переменные описываются в разделе объяв­ления переменных модуля или подпрограммы. Он начинается зарезерви­рованным словом var (от слова variable — переменная), за которым следуют объявления переменных.

При объявлении переменной указывается её имя, которое отделяется двоеточием от типа. Каждое объявление завершается точкой с запятой:

Nil — Константа

Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation .

Платформа .NET Framework обеспечивает частичную поддержку привязки для атрибута xsi:nil.

Класс XmlSerializer приравнивает значение атрибута xsi:nil=»true» к пустой ссылке, присвоенной ссылочному типу или типу значения, допускающему значение null. Класс XmlSerializer создает исключение при попытке десериализации экземпляра типа значения, не допускающего значения null, если для атрибута nil задано значение true . (Дополнительные сведения о типах, допускающих значение null, см. в разделе Nullable Types (C# Programming Guide)).

Атрибут nil определен в пространстве имен экземпляра схемы XML, http://www.w3.org/2001/XMLSchema-instance (обычно связанном с префиксом xsi), и применяется только к документам экземпляров XML, но не к документам схем XML. Значение true атрибута xsi:nil элемента XML явно указывает, что у элемента отсутствует содержимое, будь то дочерние элементы или основной текст.

Появление атрибута nil допускается только в тех элементах XML, объявление XSD которых содержит атрибут nillable со значением true . В описании атрибута nillable показано, как платформа .NET Framework определяет, применяется ли параметр nillable=»true» к элементу XML, соответствующему объекту или участнику.

Класс XmlSerializer приравнивает значение true атрибута nil к пустой ссылке («Nothing» в Visual Basic), производя во время выполнения указанные ниже преобразования.

    При десериализации документа XML в объекты: если класс XmlSerializer встречает элемент XML, в котором указано xsi:nil=»true» , соответствующему объекту назначается пустая ссылка (если применимо).

При сериализации объектов в документ XML: если класс XmlSerializer встречает пустую ссылку для объекта, соответствующего элементу XML, либо создается элемент с параметром xsi:nil=»true» , либо элемент полностью исключается — это зависит от того, применен ли параметр nillable=»true» .

Так как для типа значения, не допускающего значение null, задать пустую ссылку невозможно, то когда участник класса такого типа сопоставляется с объявлением элемента XML, класс XmlSerializer во время сериализации не имеет причин, чтобы выводить атрибут xsi:nil для соответствующего элемента экземпляра.

Класс XmlSerializer не может десериализовать элемент XML, тип данных которого сопоставляется с типом значения, не допускающим значение null, и атрибуту nil которого присвоено значение true . Если при десериализации документа XML в объекты класс XmlSerializer встречает такой элемент, он выдает исключение System.FormatException: «Входная строка имеет неправильный формат». Такая ситуация может возникнуть, если документ XML был создан реализацией схемы XML, допускающей появление атрибута nil в экземплярах типов данных схемы, которые платформа .NET Framework привязывает к типам значений, не допускающим значение null.

Спецификация схемы XML допускает появление других атрибутов XML в элементе, атрибуту xsi:nil которого присвоено значение true . Так как класс XmlSerializer задает для атрибута nil значение true только в случае, когда соответствующему объекту присвоена пустая ссылка, никакие поля объекта, представляющие атрибуты XML (через атрибут типа System.Xml.Serialization.XmlAttributeAttribute), не могут на этом этапе даже существовать в памяти.

Поэтому класс XmlSerializer обрабатывает дополнительные атрибуты указанным ниже образом.

    При сериализации объектов в документ XML: если класс XmlSerializer встречает пустую ссылку для объекта, соответствующего элементу XML, для которого должен быть задан атрибут nil, все другие атрибуты опускаются.

При десериализации документа XML в объекты: если класс XmlSerializer встречает элемент XML, в котором указано xsi:nil=»true» , соответствующему объекту назначается пустая ссылка, а все другие атрибуты игнорируются. Такая ситуация может возникнуть, если документ XML был создан реализацией схемы XML, допускающей появление других атрибутов совместно с xsi:nil=»true» — фактически не привязывая значение true атрибута nil к пустой ссылке объекта.

Рассмотрим следующее объявление со значением по умолчанию false , явно заданным для атрибута nillable:

Этот элемент будет привязан к следующему участнику класса (значение по умолчанию false явно присвоено свойству IsNullable):

Предположим, что XML-документ экземпляра содержит следующий элемент, который должен соответствовать предыдущему объявлению :

Класс XmlValidatingReader распознает этот элемент как недопустимый, так как он использует атрибут экземпляра nil, а для значения атрибута определения nillable задано значение false . Однако класс XmlSerializer не вызовет исключение при десериализации этого элемента; вместо этого для значения соответствующего поля key будет задана пустая строка в виде «» .

Возможные содержащие элементы: любой элемент экземпляра.

Справочник по стандартным функциям AUTOLISP

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

(+ 1 2) возвращает 3

(+ 1 2 3 4.5) возвращает 10.500000

( + 1 2 3 4.0) возвращает 10.000000

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

(- 50 40) возвращает 10

( — 50 40.0 2) возвращает 8.000000

(- 50 40.0 2.5) возвращает 7.500000

Эта функция возвращает произведение всех . Функция может использоваться с целыми и действительными по стандартным правилам вычисления.

( * 2 3) возвращает 6

( * 2 3 4.0) возвращает 24.000000

( * 3 -4.5) возвращает -13.500000

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

(/ 100 2) возвращает 50

( / 100 2.0) возвращает 50.000000

(/ 100 20 2.0) возвращает 2.500000

(/ 100 20.0 2) возвращает 2.500000

(/ 100 20 2) возвращает 2

(/ 135 360) возвращает 0

(/ 135 360.0) возвращает 0.375000

Функция сравнения «равно». Если все эквивалентны — возвращается Т, если хотя бы один не равно — nil. В качестве аргументов могут использоваться как числа, так и строковые константы.

( = 4 4.0) возвращает Т

( = 20 388) возвращает nil

( = 2.4 2.4 2.4) возвращает Т

( = 499 499 500) возвращает nil

( = «я» «я») возвращает Т

( = «я» «ты») возвращает nil

Функция сравнения «не равно». Если не эквивалентен — возвращается Т, если они эквивалентны — nil. Функция неопределена для числа аргументов более двух.

( /= 10 20) возвращает Т

( /= «ты» ты») возвращает nil

( /= 5.43 5.44) возвращает Т

Функция сравнения «меньше, чем». Если первый меньше, чем второй — возвращается Т, если нет — nil. Если дано более 2-х , то, если каждый предыдущий атом меньше последующего, — возвращается Т.

Функция сравнения «меньше или равно». Если первый меньше или равен второму — возвращается Т, если нет — nil. Если дано более 2-х , то, если каждый предыдущий атом меньше или равен последующему, возвращается Т.

Функция сравнения «больше». Если первый больше, чем второй — возвращается Т, если нет — nil. Если дано более 2-х , то, если каждый предыдущий атом больше последующего, — возвращается Т

(> 120 17) возвращает T

(> «c» «b») возвращает T

(> 3.5 1792) возвращает nil

(> 77 4 2) возвращает T

(> 77 4 4) возвращает nil

Функция сравнения «больше или равно», Если первый больше или равен второму — возвращается Т, если нет — nil. Если дано более 2-х , то, если каждый предыдущий атом больше или равен последующему, — возвращается Т.

(>= 120 17) возвращает T

(>= «c» «c») возвращает T

(>= 3.5 1792) возвращает nil

(>= 77 4 4) возвращает T

(>= 77 4 9) возвращает nil

Функция возвращает логическое НЕТ (дополнение до единицы).

должно быть целым. Например:

100) возвращает -100

Результат функции — , увеличенное на единицу. может быть целым или действительным

(1+ 5) возвращает 6

(1+ -17.5) возвращает -16.500000

Результат функции — , уменьшенное на единицу. может быть целым или действительным

( 1- 5) возвращает 4

(1- -17.5) возвращает -18.500000

Функция возвращает абсолютное значение . может быть целым или действительным.

( abs 100) возвращает 100

( abs -100) возвращает 100

( abs -99.25) возвращает 99.250000

Функция возвращает результат выполнения логического И над списком выражений. Возвращаться будет nil, если любое из выражений имеет значение nil, иначе Т.

(and 1.4 a c) возвращает T

(and 1.4 a b c) возвращает nil

Функция возвращает угол (в радианах) между 2-мя лучами, направленными из 2-х мерной . Первый — вдоль оси Х в сторону положительного направления, второй — в сторону 2-х мерной , где 2-х мерная точка — список 2-х действительных чисел.

( angle ‘(1.0 1.0) ‘(1.0 4.0)) возвращает 1.570796

( angle ‘(5.0 1.33) ‘(2.4 1.33)) возвращает 3.141593

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

ANGTOS

Формат преобразования

Градусы

Градусы/минуты/секунды

Грады

Радианы

Геодезическое представление

Аргумент — целое число, указывает количество цифр после запятой. Аргументы и обращаются к переменным AutoCADа AUNITS и AUPREC. Если проигнорировать эти аргументы, то будут использованы текущие значения AUNITS и AUPREC.

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

Функция берет любое число списков ( ) и сливает их вместе как один список.

(append ‘(a b) ‘(c d)) возвращает (A B C D)

(append ‘((a) (b)) ‘((c) (d))) возвращает ((A) (B) (C) (D))

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

Выполняется с аргументами, заданными .

(apply ‘+ ‘(1 2 3)) возвращает 6

(apply ‘strcat ‘(«a» «b» «c»)) возвращает «abc «

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

Функция возвращает преобразование символа в его ASCII-символьный код (целое число). Эта функция подобна функции ASC в Бейсике

(ascii «A») возвращает 65

(ascii «a») возвращает 97

(ascii «BIG») возвращает 66

Функция просматривает по ключу и возвращает точку входа . Если не найден, ASSOC возвращает nil. Например допустим, что «al» определен как:

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

(assoc ‘size al) возвращает (SIZE 4.7363)

(assoc ‘weight al) возвращает nil

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

Если не задано, ATAN вычисляет арктангенс , в радианах. может быть отрицательным; область допустимых значений от -pi до +pi радиан.

(atan 0.5) возвращает 0.463647

(atan 1.0) возвращает 0.785398

(atan -1.0) возвращает -0.785398

(angtos (atan -1.0) 0 4) возвращает «-45.0000»

Если заданы оба числа, возвращается арктангенс ( / ) в радианах. Если — ноль, в зависимости от знака , возвращается + или -1.570796 радиан (90 или -90 градусов).

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

( atof «97.1») возвращает 97.100000

( atof «3») возвращает 3.000000

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

(atoi «97») возвращает 9 7

(atoi «3») возвращает 3

(atoi «3.9») возвращает 3

Если — список — возвращается nil, иначе Т. Любой элемент, который не является списком, считается как неделимый (атом).

(atom ‘a) возвращает T

(atom a) возвращает nil

(atom ‘b) возвращает T

(atom b) возвращает T

(atom ‘(a b c)) возвращает nil

Некоторые версии LISPа различаются в своей интерпретации функции АТОМ, так что будьте внимательны при переходе из одной версии в другую.

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

Целое 1

Целое 2

Код функции

Каждый бит берется совместно с соответствующим битом , и помещается в одну из строк таблицы истинности. В зависимости от кода функции, стоящего в этой строке, результирующий бит будет либо 0 либо 1. Если в установлен подходящий бит, результирующий бит — 1, иначе — 0.

Некоторые значения эквивалентны стандартным Булевым операциям И, ИЛИ, исключающему ИЛИ, HЕ:

Функция

Операция

Результирующий бит 1, если…

Оба бита равны 1

Искл. ИЛИ

Только один из двух битов равен 1

Каждый или оба бита равны 1

Оба бита равны 0(дополнение до 1)

задает логическое И значений 12 и 5. Результат 4. Подобно:

задает логическое исключающее ИЛИ значений 6 и 5, возвращая 3.

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

(Boole 4 3 14) возвратит 12.

Функция возвращает — Т, если имеет некоторое значение (в широком смысле). Если не имеет никакого значения, или равен nil, возвращается nil.

(boundp ‘a) возвращает T

(boundp ‘b) возвращает nil

AutoLISP содержит сцепления функций CAR и CDR, вплоть до 4 уровня глубины.

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

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

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

(cadr x) эквивалентно (car (cdr x)) возвращает C

(cddr x) эквивалентно (cdr (cdr x)) возвращает (D)

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

В AutoLISPе CADR часто используется для «извлечения» координаты Y 2-х мерной и 3-х мерной точки (второй элемент списка, состоящего из 2-х или 3-х натуральных чисел). Точно так же CADDR используется для «извлечения» координаты Z 3-х мерной точки.

(setq pt2 ‘(5.2 1.0)) ( 2-х мерная точка)

(setq pt3 ‘(5.2 1.0 3.0)) ( 3-х мерная точка)


(car pt2) возвращает 5.200000

(cadr pt2) возвращает 1.000000

(caddr pt2) возвращает nil

(car pt3) возвращает 5.200000

(cadr pt3) возвращает 1.000000

(caddr pt3) возвращает 3.000000

Функция возвращает первый элемент . Если список пуст, возвращается nil.

(car ‘(a b c)) возвращает A

(car ‘((a b) c)) возвращает (A B)

(car ‘()) возвращает nil

Функция возвращает все элементы , кроме первого. Если пуст, возвращается n il.

(cdr ‘(a b c)) возвращает (B C)

(cdr ‘((a b) c)) возвращает (C)

(cdr ‘()) возвращает nil

Когда аргументом является точечная пара (смотрите CONS, ниже), CDR возвращает второй элемент, не заключая его в список.

( cdr ‘(a . b)) возвращает B

( cdr ‘(1 . «Text»)) возвращает «Text»

Функция возвращает преобразование целого числа в символьный код ASCII и результатом является строковая константа, (подобным образом действует функция CHR$ в языке Бейсик).

(chr 65) возвращает «A»

(chr 66) возвращает «B»

(chr 97) возвращает «a»

Эта функция закрывает файл и возвращает nil. извлекается из функции OPEN. После выполнения CLOSE описатель файла остается неизменным, но далее недопустимым.

Например, предположим, что Х допустимый файловый описатель открытого файла,

закроет соответствующий файл и возвратит nil.

Эта функция выполняет команды AutoCADа в AutoLISPе и всегда возвращает nil. Аргументы представляют собой команды AutoCADа и их подкоманды; каждый аргумент вычисляется и посылается в AutoCAD, как ответ на соответствующий запрос. Командные имена и опции представляются как строковые константы, 2-х мерные точки — как списки из 2-х действительных чисел, и 3-х мерные точки — как списки из 3-х действительных чисел. Командные имена воспринимаются AutoCADом только после подсказки «Command:» /команда:/.

(setq pt1 ‘(1.45 3.23))

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

(command «line» pt1 pt2)

Если допустить, что подсказка «Command:» существует, то записанные выше выражения устанавливают значения для точки «pt1», запрашивают у Вас точку «pt2» и выполняют команду AutoCADа LINE по двум заданным точкам. Аргументы функции COMMAND могут быть строковыми константами, действительными числами, целыми или точками, то есть такими, какие ожидает получить от Вас выполняемая команда в ответ на ее запросы. Пустая строка («») равносильна нажатию пробела на клавиатуре. Вызов COMMAND без аргумента равносилен нажатию CTRL C на клавиатуре, и прерывает большинство команд AutoCADа.

Команды, выполняемые функцией COMMAND не имеют эха на экране, если переменная AutoCADа CMDECHO (доступна из функций SETVAR и GETVAR ) установлена равной нулю. Функция COMMAND — основной метод доступа из AutoLISPа к командам AutoCADа.

Вводимые пользователем функции «GETxxx» (GETANGLE,GETSTRING, GETINT,GETPOINT и т.д.) не могут быть вложенными в функции COMMAND. Попытка сделать это вызовет сообщение «error: AutoCAD rejected function» (ошибка: неверная команда AutoCADа) и вызовет аварийный останов выполнения функции. При необходимости, задавайте функции GETxxx заранее или помещайте их между смежными функциями COMMAND.

Команды AutoCADа DTEXT и SKETCH считывают информацию непосредственно с клавиатуры и дигитайзера и поэтому не могут использоваться с функцией AutoLISP COMMAND. Также нельзя использовать функцию COMMAND для выполнения команд PLOT, PRPLOT или SCRIPT.

Если выполняется команда AutoCADа и в строке аргументов встречается символ PAUSE, то функция COMMAND приостановит свое действие, чтобы пользователь непосредственно ввел значение (или произвел отслеживание элемента чертежа). Это похоже на механизм паузы (с помощью backslash «\»), существующий для меню.

Если вы используете «прозрачную» команду в момент приостановки функции COMMAND, функция COMMAND остается в состоянии паузы до завершения «прозрачной» команды, после чего вернется к нормальному выполнению. Таким образом вы можете в период паузы функции COMMAND использовать команды ‘ZOOM’ и ‘PAN’ или любые необходимые Вам «прозрачные» команды. Пауза буде продолжаться до тех пор, пока не будет введен имеющий силу аргумент и пока не выполняться все «прозрачные» команды.

(command «circle» «5,5» pause «line» «5,5» «7,5» «»)

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

Ввод с помощью меню не исключается паузой AutoLISPа. Если активизировано меню и функция COMMAND требует ввода, находясь в паузе, запрос может быть удовлетворен с помощью меню. Если вы хотите также приостановить действие меню, в меню следует предусмотреть backslash. Когда будет дан имеющий силу ответ, и функция COMMAND и функция меню возобновят свою работу .

Символ PAUSE является строковой константой со значением backslash. Вы можете использовать backslash непосредственно вместо символа PAUSE, однако если функция COMMAND используется как элемент меню, то backslash будет восприниматься не как аргумент функции COMMAND, но как опция элемента меню, который выполняется в текущий момент. Кроме того механизм прерывания может запрашивать различные управляющие значения в последующих версиях AutoLISPа, поэтому мы рекомендуем во всех случаях пользоваться символом PAUSE вместо backslash.

Если PAUSE встречается в команде, требующей ввода текста или значения Атрибута, AutoCAD прервется для ввода, только если значение системной переменной TEXTEVAL не равно нулю. В противном случае значение символа PAUSE — backslash будет воспринято как текст и прерывания для ввода не произойдет.

Когда выполнение функции COMMAND прервано для ввода, функция находится в состоянии «active» /на выполнении/, поэтому пользователь не может вводить для выполнения другие выражения AutoLISPа.

Эта функция воспринимает любое число списков как аргументы. Она оценивает первый элемент списка (по очереди) до тех пор, пока не встретится отличный от nil. Затем вычисляется то выражение, которое следует за тестом и возвращает значение последнего выражения в подсписке. Если в подсписке только одно выражение (например, отсутствует), возвращается значение выражения . COND — основная функция условия в AutoLISPе.

Например, использование функции COND для вычисления абсолютного значения числа:

(cond ((minusp a) (- a))

Если в «а» было установлено значение -10, будет возвращено 10. Как видно, COND может использоваться как функция типа «case» /в случае. /. Принято в качестве последнего (по умолчанию) выражения использовать символ T.

Еще один простой пример. Задавая запрос пользователя в символ «s», эта функция проверяет ответ и возвращает 1, если ответ » Y» или «y», а если ответ «N» или «n», то 0, иначе nil.

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

(cons ‘a ‘(b c d)) возвращает (A B C D)

(cons ‘(a) ‘(b c d)) возвращает ((A) B C D)

Заметим, что первый элемент может быть атомом или списком.

CONS так же воспринимает атом на месте аргумента , конструируя структуру, известную как точечная пара. Показывая точечную пару на экране, AutoLISP печатает точку между первым и вторым элементами. Точечные пары занимают меньше места в памяти, чем обычные списки и можно использовать функцию CDR для извлечения второго атома.

(cons ‘a ‘b) возвращает (A . B)

(car (cons ‘a ‘b)) возвращает A

(cdr (cons ‘a ‘b)) возвращает B

Эта функция возвращает косинус , где — выражается в радианах.

(cos 0.0) возвращает 1.000000

(cos pi) возвращает -1.000000

DEFIN — определяет функцию с именем (заметим, что имя функции автоматически берется в кавычки и поэтому не требуется этого делать самому). Имя, следующее за функцией — это список аргументов (возможно пустой), за которым следует (факультативно) косая черта (slach) и имена одного или более локальных символов функции. Косая черта должна отстоять от первого локального символа и последнего аргумента, если он есть, хотя бы на один пробел. Если нет аргументов и локальных символов, которые следует объявлять, за именем функции следует поставить пустые скобки.

(defun myfunc (x y) . ) (функция берет два аргумента)

(defun myfunc (/ a d) . ) (функция имеет два локальных символа)

(defun myfunc (x / temp) . ) (один аргумент и один локальный символ )

(defun myfunc () . ) (без аргументов и локальных символов)

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

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

(defun add10 (x)(+ 10 x) возвращает ADD10

(add10 5) возвращает 15

(add10 -7.4) возвращает 2.60000

(defun dots (x y / temp)

(setq temp (strcat x «. «))

(dots «a» «b») возвращает «a. b»

(dots «from» «to») возвращает «from. to»

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

Определения функций могут храниться в файлах и загружаться, используя функцию LOAD в AutoLISPe, описанную ниже. Если существует файл «acad.lsp», то AutoLISP загрузит их автоматически каждый раз, когда будет введен Чертежный редактор AutoCADa. Вы можете использовать это обстоятельство для создания библиотеки используемых функций и быть уверенным, что они всегда под рукой, когда понадобятся.

Любой библиотечный «.lsp» файл может содержать выражения вне функции DEFUN. Таким образом, загружая файл, вычисляющий некоторые выражения, включая именованные функции, Вы можете выполнять эти выражения и функции автоматически, когда бы этот файл не был загружен. Однако, загрузка файла «acad.lsp» производится еще до полной инициализации Чертежного Редактора AutoCADа, поэтому не следует использовать функции COMMAND в файле «acad.lsp» (вне функции DEFUN).

Вы можете добавить новые команды в AutoCAD, используя функцию DEFUN, чтобы определить эти команды как функции. Для того чтобы ими пользоваться как командами AutoCADа, такие функции должны удовлетворять следующим правилам:

1. Имя функции должно быть формы «С:ХХХ», где все буквы — заглавные. Часть имени «С:» должна всегда присутствовать; часть имени «ХХХ» может быть любым именем команды на ваш выбор, только не должна дублировать какую-либо команду AutoCADa, внешнюю или встроенную функцию.

2. Функция должна быть определена без аргументов — пустой список (хотя локальные символы допускаются).

Например, следующая запись определяет функцию, изображающую на экране

квадрат с помощью Полилинии:

(defun C:PSQUARE (/ pt1 pt2 pt3 pt4 len)

(setq pt1 (getpoint » Lower left corner: «)) /Hижний левый угол: /

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

Функции определенные таким образом могут вызываться простым вводом «ХХХ» части имени функции, когда появилось сообщение AutoCADa «Command:». Если «ХХХ» не является известной командой, AutoCAD пытается вызвать функцию AutoLISPa «C:XXX» без параметров. Для приведенной выше функции C:PSQUARE диалог будет таким:

Lower left corner: (ввод точки)

Length of one side: (ввод расстояния)

После чего функция вызовет команду AutoCADа PLINE и ответит на ее запросы для вычерчивания заданного квадрата.

Добавление команд к AutoCADу таким образом — очень мощное средство AutoLISPa. Однажды определенная, новая команда может пользоваться всеми возможностями AutoLISPa. Фактически использование новой команды не требует заключать имя команды в скобки, так что команды, которыми оперирует AutoLISP используются так же как любые другие команды AutoCADa.

Эта функция возвращает расстояние между 2-х мерными точками , где 2-х мерная точка — это список двух действительных чисел.

(distance ‘(1.2 2.5) ‘(7.7 2.5)) возвращает 6.700000

(distance ‘(1.0 2.0) ‘(3.0 4.0)) возвращает 2.828427

Эта функция определяет идентичны ли и , т.е. они фактически относятся к одному объекту (например, с помощью SETQ). EQ возвращает Т, если оба выражения идентичны, иначе nil. Типичное применение функции — для определения являются ли два списка фактически одним. Например, зададимся следующими допущениями:

(eq f1 f3) возвращает nil (f1 и f3 не одно и то же)

(eq f3 f2) возвращает T (f3 и f2 один и тот же список)

Смотри так же функцию EQUAL ниже.

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

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

(equal f1 f3) возвращает T(значением f1 и f3 является одно и то же)

(equal f3 f2) возвращает T(f3 и f2 в точности один и тот же список)

Отметим, что в то время, как два списка EQUAL, они могут не быть EQ, атомы, которые EQUAL всегда к тому же EQ. Добавим, что два списка, которые EQ, всегда EQUAL.

Функция возвращает результат выражения , где — любое выражение языка LISP. Например, дано:

(eval 4.0) возвращает 4.000000

(eval (abs -10)) возвращает 10

(eval a) возвращает 123

(eval b) возвращает 123

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

(exp 1.0) возвращает 2.718282

(exp 2.2) возвращает 9.025013

(exp -0.4) возвращает 0.670320

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

(expt 2 4) возвращает 16

(expt 3.0 2.0) возвращает 9.000000

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

(fix 3) возвращает 3

(fix 3.7) возвращает 3

Функция возвращает преобразование в действительное. может быть как целым так и действительным.

(float 3) возвращает 3.000000

(float 3.7) возвращает 3.700000

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

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

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

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

Илон Маск рекомендует:  Другие платформы

(gcd 81 57) возвращает 3

(gcd 12 20) возвращает 4

Эта функция создает паузу для того, чтобы пользователь ввел угол. — факультативная запись для высвечивания на экране в качестве подсказки, а — факультативная 2-х мерная базовая точка. Вы можете задать угол путем набора числа на клавиатуре в текущих для AutoCADa единицах измерения. Заметим, что, несмотря на то, что текущая единица измерения угла может быть градус, град, или какая либо еще, функция всегда возвращает угол в радианах.

Вы можете так же «показать» AutoLISPу угол путем указания двух 2-х мерных точек на экране. AutoCAD нарисует «резиновую» линию от первой точки к текущему положению курсора для того чтобы визуализировать угол. Факультативный аргумент GETANGLE — (если указывается) подразумевается как первая из этих двух точек, позволяя тем самым вам «показать» AutoLISPу угол, указывая на следующую точку

Ниже приведены примеры функции 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? «)) /»В какую сторону? «/

Вы не можете ввести другое выражение LISPa, как ответ на запрос функции GETANGLE. При попытке сделать так, появится сообщение «Can’t reenter AutoLISP » /»Hе могу войти в AutoLISP»/. Смотрите также GETORIENT INI TGET.

GETCORNER возвращает точку, так же как GETPOINT. Однако для GETCORNER требуется и функция строит прямоугольник от в то время как пользователь передвигает курсор по экрану. Смотрите GETROINT и INITGET для уточнения.

Вы не можете ввести другое LISP-выражение в ответ на запрос GETCORNER.

Эта функция создает паузу для того, чтобы пользователь ввел расстояние. [ ] — факультативная запись для высвечивания на экране в качестве подсказки, — факультативная базовая точка. Вы можете указать расстояние, набрав число на клавиатуре в текущих для AutoCADa единицах измерения. Заметим, какими бы ни были текущие единиц измерения (например, футы или дюймы), функция всегда возвращает расстояние как действительное число.

Вы можете так же «показать» AutoLISPу расстояние , указав две точки на экране. AutoCAD рисует «резиновую» линию от первой точки до текущего положения курсора для того, чтобы визуалировать расстояние. Факультативный аргумент GETDIST подразумевается как первый из этих двух точек, позволяя вам «показать» AutoLISPу расстояние, путем указания в любую другую точку.

Ниже приведены примеры функции 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? «)) /»Как далеко? «/

Вы не можете ввести другое LISP-выражение как ответ на запрос GETDIST. Смотрите также INITGET.

Эта функция ожидает ввода пользователем целого числа и возвращает его. — факультативная запись для высвечивания на экране в качестве подсказки.

(setq num (getint))

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

Вы не можете ввести другое LISP-выражение на запрос GETINT. Смотрите также INITGET.

Эта функция запрашивает ключевое слово у пользователя. Список имеющих смысл ключевых слов задается, прежде чем вызывается функция GETKWORD, пользуясь функцией INITGET (описывается ниже). GETKWORD возвращает ключевое слово, соответствующее введенному пользователем как строковую константу. AutoCAD переспросит, если введенное не является одним из заданных ключевых слов. Пустой ввод возвращает nil (если позволяется вводить пустой ввод). Если не было установлено ни одного ключевого слова, также возвращается nil.

(initget 1 «Yes No»)

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

/»Вы уверены? (Да или Hет) «/

запросит пользователя и установит в символ Х либо «Yes», либо «No», в зависимости от его ответа. Если ввод не соответствует ни одному ключевому слову, или же пользователь ответил пустым вводом, AutoCAD попросит пользователя повторить ввод еще раз.

Вы не можете ввести другое LISP-выражение на запрос GETKWORD.

Смотрите также INITGET.

В AutoLISPe углы всегда представляются в радианах с нулевым направлением слева направо (восток) и углы откладываются против часовой стрелки. Таким образом, должны иметь месть некоторые изменения, если пользователь хочет выбрать отсчет в градусах или желает изменить направление отсчета углов, используя команду UNITS или системные переменные ANGBASE и A NGDIR.

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

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

Введено (градусы)

GETANGLE

GETORIENT

0.000000

1.570796

1.570796

3.141593

3.141593

4.712389

4.712389

0.000000

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

Вы не можете ввести другое LISP-выражение в качестве ответа на запрос GETORIENT. Смотрите также GETANGLE и INITGET.

Эта функция запрашивает от пользователя точку . Факультативный аргумент — базовая [ ] и [ ] — факультативная запись для высвечивания на экране в качестве подсказки. Вы можете ввести точку путем указания ее на экране или записав координаты в текущих единицах измерения. Если присутствует аргумент , AutoCAD нарисует «резиновую» линию от этой точки до текущего положения курсора.

(setq p (getpoint))

(setq p (getpoint «Where? «)) /»Где? «/

(setq p (getpoint ‘(1.5 2.0) » Second point: «)) /»Вторая точка: «/

Обычно, GETPOINT возвращает 2-х мерную точку (список из двух действительных чисел). Используя функцию INIGET для установки контрольного символа «3-х мерная точка», вы можете заставить GETPOINT возвращать 3-х мерную точку (список из трех действительных чисел).

Вы не можете ввести иное LISP-выражение в ответ на запрос GETPOINT. Смотрите также GETCORNER и INITGET.

Эта функция запрашивает пользователя ввести действительное число и возвращает его. — необязательный аргумент для высвечивания на экране в виде подсказки.

(setq val (getreal))

(setq val (geyrial «Scale factor: «)) /»Масштабный фактор: «/

Вы не можете ввести иное LISP-выражение в ответ на запрос GETREAL. Смотрите также INITGET.

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

(setq s (getstring))

(setq s (getstring «What’s your fist name? «)) /»Ваше имя? «/

(setq s (getstring T «What’s your full name? «)) /»Ваше полное имя? «/

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

Вы не можете ввести иное LISP-выражение как ответ на запрос GETSTRING.


Эта функция возвращает значение системной переменной AutoCADa. Имя переменной должно быть заключено в кавычки («имя»).

Например, предположим, что радиус сопряжения был недавно определен в 0.25 единиц:

(getvar «FILLETRAD») возвращает 0.250000

Если вы используете GETVAR с неизвестным AutoCADу именем переменной, функция возвратит nil. Список текущих системных переменных AutoCADa можно найти в приложении А руководства по AutoCADу. Смотрите также функцию SETVAR.

Эта функция переключает экран с текстового режима в графический в системах с одним экраном (также как функциональная клавиша «FLIP SCREEN» в AutoCADe). GRAPHSCR всегда возвращает nil. Смотрите так же функцию TEXTSCR.

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

(if (= 1 3) «Yes!!» «no.») возвращает «no.»

(if (= 2 (+ 1 1) «Yes!!») возвращает «Yes! !»

(if (= 2 (+ 3 4) «Yes!!») возвращает nil

Эта функция устанавливает различные опции для использования последующими функциями GETxxx (кроме GETSTRING и GETVAR). INITGET всегда возвращает nil. — факультативный аргумент — целое число со следующими значениями

INIGET биты

Значения

Запрещен ввод недействительных чисел

Запрещен ввод 0

Запрещен ввод отрицательных чисел

Не контролируются пределы, даже при включенном LIMCHECK

Возвращение 3-х мерных точек, предпочтительнее, чем 2-х мерных точек

Применяется пунктир для изображения «резиновой» линии или рамки

Биты могут добавляться вместе в любой комбинации, чтобы сформировать значение от 0 до 63. (Последующие версии AutoLISPа могут включать дополнительные контрольные биты, так что избегайте указывать незадокументированные биты).

Если пользователь, вводя, забыл одно или более заданных условий (так, например, ввел 0, когда ввод 0 запрещен), AutoCAD высветит ошибку и предложит пользователю повторить ввод.

(setq age (getint «How old are you? «)) /»Сколько Вам лет? «/

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

Контрольный бит со значением 32 воспринимается функциями GETPOINT, GETCORNER, GETDIST, GETANGLE и GETORIENT когда присутствует аргумент , и устанавливает режим использования пунктирной (или по-другому подсвеченной) линии в качестве «резиновой» линии или рамки, отрисовываемых курсором от заданной базовой точки. Если системная переменная POPUPS равна нулю, указывая тем самым, что драйвер дисплея не поддерживает улучшенный интерфейс пользователя, то AutoCAD проигнорирует этот бит функции INITGET.

Функции

Контрольные биты INITGET воспринимаются

Не пустой

Не отриц.

Нет пределов

Использовать пунктир

GETING

GETREAL

GETDIST

GETANGL

GETORIENT

GETCORNER

GETKWORD

GETSTRING

GETVAR

Факультативный аргумент INITGET-функции определяет список ключевых слов, которые будут проверяться в последующем запросе GETxxx, если пользователь произвел ввод неправильного типа (например, точку для GETPOINT). Если ввод пользователя соответствует одному из ключевых слов из этого списка, это ключевое слово возвращается GETxxx функцией как результат типа STRING (строковая константа). Программа пользователя может тестировать ключевые слова и выполнять желаемые действия для каждого из них. Если ввод пользователя недозволенного типа и не соответствует ни одному из ключевых слов, AutoCAD предложит пользователю повторить ввод.

Список ключевых слов может быть такой формы :»Key1 KEy2 KEY3,ABBREV3″. Отдельные ключевые слова отделяются пробелами. Сокращение необязательно и возможны два способа специфицирования. Необходимая для ввода часть ключевого слова может быть выделена заглавными буквами, остальная часть строчными или необходимая часть может быть повторена через запятую после ключевого слова. Второй способ применяется в случае использования иностранного языка, где переход из прописных в заглавные буквы сложен или невозможен . В обоих случаях длина необходимой части — минимальная длина, которая должна быть для точного различения. (Для метода с разделением запятой подразумевается, что сокращение — это начало ключевого слова.)

«LTYPE,LT» и «LType»

эквивалентные спецификации. Будет восприниматься любой ввод пользователя из «LTYPE», «LTYP», «LTY» или «LT», но «L» недостаточно, не подходят и «LTSCALE» «LTYPEX».

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

(defun getnum (/ x)

(initget 1 «Pi Two-pi»)

(setq x (getreal «pi/Two-pi/ :»))

(cond ((eq x «Pi») pi)

((eq x «Two-pi:») (* 2.0 pi))

Здесь INITGET препятствует пустому вводу и устанавливает список из двух ключевых слов «Pi» и «Two-pi». Затем используется GETREAL для извлечения вещественного числа с помощью подсказки «Pi/Two-pi/ :» и результат помещается в локальный символ Х. Если пользователь вводит число, это число возвращается функцией GETNUM. Однако, если пользователь вводит ключевое слово «Pi» (или просто «P»), GETPOINT возвращает ключевое слово «Pi». Функция COND фиксирует это и в этом случае возвращает значение pi. Ключевое слово «Two-pi» трактуется аналогично.

Список управляющих сигналов и ключевых слов, устанавливаемые INITGET, применимы только к следующему за INITGET вызываемому GETxxx и затем автоматически сбрасываются. Это позволяет Getxxx-функций избежать необходимости при следующем вызове очищать специальные состояния.

Функция INTERS проверяет два отрезка на пересечение и возвращает точку пересечения или nil, если они не пересекаются. и крайние точки первого отрезка, — крайние точки второго отрезка. Если факультативный аргумент присутствует и является nil, то отрезки будут восприниматься бесконечной длины и INTERS будет возвращать точку пересечения даже, если она находится за крайними точками одного или обоих отрезков. Если же аргумент отсутствует или не является nil, то точка пересечения должна находится на обоих отрезках или INTERS вернет ni l.

(setq a ‘(1.0 1.0) b ‘(9.0 9.0))

(setq c ‘(4.0 1.0) c ‘(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)

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

(itoa 33) возвращает «33»

(itoa -17) возвращает «-17»

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

(apply ‘(lambda (x y z)

(mapcar ‘(lambda (x)

(setq counter (1+ counter))

) возвращает (10 20 -30 51.000000)

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

(last ‘(a b c d e)) возвращает E

(last ‘(a b c (d e))) возвращает (D E)

Как видно, LAST возвращает либо атом, либо список.

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

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

(length ‘(a b c d)) возвращает 4

(length ‘(a b (c d))) возвращает 3

(length ‘()) возвращает 0

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

(list ‘a ‘b ‘c) возвращает (A B C)

(list ‘a ‘(b c) ‘d) возвращает (A (B C) D)

(list 3.9 6.7) возвращает (3.90000 6.70000)

В AutoLISP эти функции часто используются для определения значений 2-х и 3-х мерных точек (список из 2-х или 3-х действительных чисел).

Эта функция возвращает T, если список, иначе nil.

(listp ‘(a b c)) возвращает T

(listp ‘a) возвращает nil

(listp 4.343) возвращает nil

Эта функция загружает файл выражений AutoLISPа и выполняет эти выражения. — это строковая константа, которая представляет собой имя файла без расширения (подразумевается расширение «.lsp»). может включать префикс директории, например » / function/test1″. На системах MS-DOS/PS-DOS допускается так же использовать букву устройства ввода/вывода и вы можете пользоваться обратной косой чертой вместо прямой косой черты (но помните, чтобы ввести в строку одну обратную черту вы должны использовать «\\»).

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

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

(load «/fred/test1») возвращает MY-FUNC

(load «test2») возвращает «test2»

Функция LOAD не может вызываться из другой функции LISP. Она должна вызываться непосредственно с клавиатуры (или из меню или скрипт-файла), в то время как ни одна другая функция LISP не находится в процессе выполнения.

Каждый раз, когда Редактор Чертежей AutoCAD начинает очередной сеанс, AutoLISP загружает файл «acad.lsp», если он существует. Вы можете поместить определения функций и часто используемые команды в этот файл, и они будут исполняться автоматически, когда вы будете редактировать чертежи.

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

(log 4.5) возвращает 1.504077

(log 1.22) возвращает 0.198850

Эта функция возвращает результат действия побитового И над списком . Эти должны быть целые и результат — так же целое число.

(logand 7 15 3) возвращает 3

(logand 2 3 15) возвращает 2

(logand 8 3 4) возвращает 0

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

(logior 1 2 4) возвращает 7

(logior 9 3) возвращает 11

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

Если положительно, то сдвигается влево; если отрицательно — то вправо. В каждом случае «нулевые» биты добавляются, а сдвигаемые биты сбрасываются. Если «единичный» бит сдвигается в высший (16-й) разряд целого числа, знак числа меняется.

(lsh 2 1) возвращает 4

(lsh 2 -1) возвращает 1

(lsh 40 2) возвращает 160

(lsh 16384 1) возвращает -32768

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

(mapcar ‘1+ ‘(10 20 30)) возвращает (11 21 31)

Кроме того, что MAPCAR возвращает список результатов. Так же:

(mapcar ‘+ ‘(10 20 30) ‘(4 3 2)) возвращает (14 23 32)

это то же самое, что и:

Функция LAMBDA может задавать «анонимную» функцию для выполнения функцией MAPCAR. Это полезно когда некоторые из аргументов функции константы или передаются каким-либо иным образом.

(mapcar ‘(lambda (x) (+ x 3)) ‘(10 20 30)) возвращает (13 23 33)

(mapcar ‘(lambda (x y z)

‘(5 6) ‘(20 30) ‘(14 5.0)

) возвращает (30 150.0 00000)

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

(max 4.07 -144) возвращает 4.070000

(max -88 19 5 2) возвращает 19

Эта функция просматривает — встречается ли и возвращает часть , начинающуюся с первого найденного . Если в нет , MEMBER возвращает nil.

( member ‘c ‘(a b c d e)) возвращает (C D E)

( member ‘q ‘(a b c d e)) возвращает nil

Эта функция дает возможность LISP-программам переключаться среди подстраниц в меню AutoCAD . Таким образом, LISP-программа может согласованно работать с загруженными файлами меню, высвечивая соответствующие подменю в то время, когда требуется ввод пользователя. MENUCMD всегда возвращает nil. Аргумент записывается в следующей форме:

где раздел указывает раздел меню. Допустимые имена:

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

B для кнопочного (BUTTONS) меню

I для пиктографического (ICON) меню

P1-P10 для падающего (POP) меню с 1 по 10

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

А1 для добавочного (AUX1) меню

подменю указывает, какое подменю активизировать. Именем должна быть либо одна из меток подменю (без «**») в текущем загруженном файле или имя одного из разделов Главного меню.

Для дальнейшей информации смотрите Приложение Б Руководства AutoCAD. Заметим, что используемый для ссылки на подменю знак «$» в файле меню здесь не используется.

будет означать, что подменю «OSNAP» появится на экране (имеется в виду, что такое подменю существует в текущем файле меню).

будет присваивать подменю «MY-BUTTONS» кнопочному меню.

Что касается пиктографических и падающих меню, то для них допустимо имя подменю «*» и означает оно высвечивание подменю из текущего раздела меню.

выберет подменю «NUMERIC» из падающего меню 1 и высветит его на экране.

MENUCMD всегда возвращает nil.

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

(min 683 -10.0) возвращает-10.000000

(min 73 2 48 5) возвращает2

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

(minus -1) возвращает T

(minusp -4.293) возвращает T

(minusp 830.2) возвращает nil

Эта функция возвращает Т, если выражение — nil, иначе nil. Обычно функция NULL используется для списков, а NOT для других типов данных в связи с каким-либо типом управляющих функций.

(not a) возвращает nil

(not b) возвращает nil

(not c) возвращает T

(not ‘()) возвращает T

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

Эта функция возвращает Т, если вычисляется в nil, иначе nil.

(null a) возвращает nil

(null b ) возвращает nil

(null c) возвращает T

(null ‘()) возвращает T

Эта функция возвращает Т, если — целое или действительное число, иначе nil.

(numberp 4) возвращает T

(numberp 3.8348) возвращает T

(numberp «Howdy») возвращает nil

(numberp ‘a) возвращает nil

(numberp a) возвращает T

(numberp b) возвращает nil

(numberp (eval b)) возвращает T

Эта функция открывает файл для доступа функций Ввода/Вывода (I/O) AutoLISP. Она возвращает описатель файла для использования другими функциями Ввода/Вывода, поэтому она должна присваиваться функцией SETQ

(setq a (open «file.ext» «r»))

— это строковая константа, указывающая имя и расширение открываемого файла. — это флаг чтения/записи. Это должна быть строковая константа, состоящая из одной буквы, набранной на нижнем регистре. Допустимые значения букв режима описываются в следующей таблице.

Режим OPEN

Описание

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

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

Открыть для добавления. Если не существует, создается новый файл и открывается. Если уже существует, он будет открыт и помещен таким образом, что любые новые данные будут записываться в файл вслед за уже существующими. В системах DOS некоторые программы и текстовые редакторы записывают текстовые файлы с маркером конца файла (CTRL Z, десятичный код ASCII 26) в конце текста. Читая текстовый файл, DOS возвращает состояние конца файла, если встретит маркер CTRL Z, даже если после маркера присутствуют еще данные. Если вы намерены использовать режим «а» функции O PEN для добавления данных в файлы, созданные другими программами, удостоверьтесь, что другая программа не вставила маркеры CTRL Z в конце своих текстовых файлов.

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

(setq f (open «new.tst» «w»)) возвращает

(setq f (open «nosuch.fil» «r»)) возвращает nil

(setq f (open «longfile» «a»)) возвращает

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

(setq f (open «new.tst» «w»)) возвращает

(setq f (open «nosuch.fil» «r»)) возвращает nil

Эта функция возвращает логическое ИЛИ списка выражений. OR оценивает выражения слева направо до тех пор, пока не встретится выражение, вычисляемое не в nil. Если такое найдено, OR прекращает дальнейшую оценку и возвращает T. Если все выражения nil, OR возвращает nil.

(or nil 45 ‘()) возвращает Т.

(or nil ‘()) возвращает nil.

Эта функция возвращает точку, которая является результатом применения объектной привязки, задаваемой в для точки . — строковая константа, состоящая из одного или более идентификаторов объектной привязки, как, например, «midpoint», «center» и т.д., разделенных запятыми.

(setq pt2 (osnap pt1 «midp»))

(setq pt2 (osnap pt1 «midp,endp,center»))

Если аргумент — 2-х мерная точка (список из двух действительных чисел), то будет возвращена 2-х мерная точка. Если аргумент — 3-х мерная точка (список из трех действительных чисел), то будет возвращена 3-х мерная точка. Если ни одной точки, соответствующей заданному объектной привязки не найдено, будет возвращаться nil.

Это не функция, это константа pi. Ее значение принято 3.1415926.

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

(polar ‘(1.0 1.0) 0.785398 1.414214) возвращает (2.000000 2.000000)


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

(prin1 ‘a) печатает А и возвращает А

(prin1 a) печатает 123 и возвращает 123

(prin1 b) печатает (А) и возвращает (А)

(prin1 «Hello») печатает «hello» и возвращает «Hell o»

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

запишет «Hello» в указанный файл и возвратит «Hello».

Если — это строковая константа, включающая управляющие символы, PRIN1 интерпретирует эти символы, как следующие, добавляя перед ними знак «\»:

\е для выхода (escape)

\n для перехода на новую строку (newline)

\r для ввода (return)

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

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

(prin1 (chr 2)) печатает «\002» и возвращает «\002»

(prin1 (chr 10)) печатает «\n» и возвращает «\n»

PRIN1 может использоваться и без аргументов, тогда она возвращает (и печатает) символ, называемый пустой строкой символов. Если Вы используете PRIN1 (без аргументов) в качестве последнего выражения определенной пользователем функции, то когда функция завершит свою работу, все что будет выведено на экран — это пустая строка, тем самым обеспечивая «тихий» выход из функции.

(setvar «LUNITS» 4)

(setvar «BLIPMODE» 0)

исполнит определенную пользователем команду, отвечая на запросы функции SETVAR, и вернется к подсказке AutoCADа «Command:», не выводя на экран никаких лишних сообщений.

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

Эта функция похожа на PRIN1, кроме того что печатается с новой строки, а после ставится пробел.

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

Функция IF нормально выполняет одно выражение «then» /тогда/, если условие выполняется и не равно nil. В этом примере мы использовали PROGN, чтобы выполнялось два выражения вместо одного.

Эта функция высвечивает сообщение в поле подсказок экрана и возвращает nil. — строка символов. В системе AutoCAD с двумя экранами PROMT высвечивает на обоих экранах и поэтому предпочтительно использовать PRINC.

(prompt «Новое значение: «)

высвечивает «Новое значение: » на экране (экранах) и возвращает nil.

Возвращает выражение не выполняя его. Это может быть так же записано:

(quote a) возвращает А

(quote сat ) возвращает CАT

(quote (a b)) возвращает (А B)

‘cat возвращает CАT

‘(a b) возвращает А

(Последние три примера не будут работать, если их набрать непосредственно с клавиатуры в ответ на запрос AutoCAD. Помните, что такой ввод должен начинаться с «(» или «!» с целью интерпретации их как выражений LISP.)

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

(read «hello») возвращает HELLO

(read «hi») возвращает HI

(read «(a)») возвращает (A)

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

Если не задано и в буфере ввода клавиатуры нет символов, READ-CHAR ждет, чтобы вы ввели что-либо с клавиатуры (заканчивающееся RETURN).

Например, допустим, что буфер клавиатуры пуст:

будет ждать какого-либо ввода. Если вы набрали «АВС», завершив ввод RETURN, READ-CHAR возвратит 65 (код AS0CII буквы «А» (латинской)). Следующие три обращения к READ-CHAR возвратят 66,67 и 10 (переход на новую строку) соответственно. Если затем последует еще одно обращение к READ-CHAR, она будет ждать ввода.

Эта функция считывает строку символов с клавиатуры или из открытого файла, заданного ; READ-LINE возвращает nil, иначе она возвращает строковое значение, которое было считано. Например, допустим, что F — это разрешенный указатель открытого файла:

возвратит следующую введенную строку из файла или (если достигнут конец файла) nil.

Действие функции зависит от числа введенных аргументов. Если она вызывается без аргументов:

будет нарисован весь чертеж, точно так же, как это делает команда AutoCAD REDRAW. Если вызывается с аргументом :

выбранный примитив будет перерисован. Это используется для идентификации примитива на экране после использования функции GRCLEAR для очистки экрана. Имена примитивов описаны в главе 5 настоящего руководства. Полный контроль за перерисованием примитива обеспечивается вызовом REDRAW с двумя аргументами:

где — это имя перерисовываемого примитива, а — это целое число с одним из следующих значений:

Режим REDRAW

Действие

Перечерчивание примитива на экране

Не рисует примитив (стирает)

Подсвечивает примитив (если может дисплей)

Перестает подсвечивать примитив ( если может дисплей )

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

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

(rem 42 12) возвращает 6

(rem 12.0 16) возвращает 12.000000

(rem 60 3) возвращает 0

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

Эта функция возвращает c его элементами, расставленными в обратном порядке.

(reverse ‘((a) b c)) возвращает (С В (А))

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

Режимы RTOS

Формат представления

Научный

Десятичный

Инженерный (футы и десятичные дюймы)

Илон Маск рекомендует:  Что такое код imagecreatefromjpeg

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

Произвольные дробные части

Аргументы и соответствуют системным переменным AutoCAD LUNITS и LUPREC. Если опустили эти аргументы, то будут использованы текущие значения LUNITS и LUPREC.

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

Присваивает (где — имя символа с кавычкой спереди) значение и возвращает это значение.

(set ‘a 5.0) возвращает 5.000000 и устанавливает в символ А

(set (quote b) ‘a) возвращает А и устанавливает в символ В.

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

Например, возьмем вышеприведенные примеры:

(set b 640) вернет 640

и присвоит значение 640 символу А (поскольку это значение символа В).

Смотрите также ниже SETQ.

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

(setq a 5.0) возвращает 5.000000

и присваивает значение 5.000000 символу А. Когда бы ни вычислялось A, оно будет вычисляться равным действительному числу 5.000000.

(setq b 123 c 4.7) возвращает 4.7

(setq s «it») возвращает «it»

(setq x ‘(a b)) возвращает (A B)

Функции SET и SETQ создают или модифицируют глобальные символы в тех случаях, когда функции не используются в функции DEFUN для присваивания значений аргументу функции или символу, объявленному как локальному для этой DEFUN.

(setq glo1 123) ; создание глобального символа

(defun demo (arg1 arg2 / loc1 loc2)

(setq arg1 234) ; присвоение нового локального значения

(setq log1 345) ; присвоение нового локального значения

(setq glo1 456) ; присвоение нового глобального значения

(setq glo2 567) ; создание нового глобального символа

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

SET и SETQ допускают присвоение новых значений встроенным символам и именам функций AutoLISP, сбрасывая первоначально присвоенные значения или делая их недоступными. Некоторые пользователи тщетно пытаются сделать следующее:

(setq anagle (. )) Неверно!

(setq length (. )) Неверно!

(setq max (. )) Неверно!

(setq t (. )) Неверно!

(setq pi 3.0)) Неверно!

Чтобы избежать всех видов таких странных ошибок, будьте внимательны, когда придумываете имена своим символам. Никогда не используйте встроенный символ или имя функции для своего символа! (Для уничтожения списка имен символов наберите «!АТОМLIST» на запрос «Command:» AutoCAD перед загрузкой (LOAD) какой-либо функции AutoLISP.)

Эта функция присваивает системной переменной AutoCAD заданное и возвращает это значение. Имя переменной должно быть заключено в двойные кавычки.

(setvar «FILLETRAD» 0.50) возвращает 0.500000

устанавливает радиус сопряжения в AutoCAD равным 0.5 единиц.

Некоторые команды AutoCADа выбирают системные переменные без всяких подсказок. Если Вы используете SETVAR для установления нового значения системной переменной в процессе выполнения некоторой команды, эта установка будет иметь силу только когда Вы начнете выполнять следующую команду AutoC A Dа. Список текущих системных переменных AutoCAD можно найти в приложении А руководства AutoCAD. Смотрите также функцию GETVAR.

Эта функция возвращает синус как действительное число, где выражен в радианах.

(sin 1.0) возвращает 0.841471

(sin 0.0) возвращает 0.000000

Эта функция возвращает квадратный корень как действительное число.

(sqrt 4) возвращает 2.000000

(sqrt 2.0) возвращает 1.414214

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

(strcase «Sample») возвращает «SAMPLE»

(strcase «Sample» Т) возвращает «sample»

Эта функция возвращает строку, которая является результатом сцепления , и т.д.

(strcat «a» «bout») возвращает «about»

(strcat «a» «b» «c») возвращает «abc»

(strcat «a» «» «c») возвращает «ac»

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

(stalen «abcd») возвращает 4

(stalen «ab») возвращает 2

(stalen «») возвращает 0

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

(setq sample ‘(a b (c d) b))

(subst ‘qq ‘b sample) возвращает (A QQ (C D) QQ)

(subst ‘qq ‘z sample) возвращает (A B (C D) B)

(subst ‘qq ‘(c d) sample) возвращает (A B QQ B)

(subst ‘(qq ‘rr) ‘(c d) sample) возвращает (A B (QQ RR) B)

(subst ‘(qq ‘rr) ‘z sample) возвращает (A B (C D) B)

В сочетании с функцией ASSOC, SUBST обеспечивает удобный способ замены величины, найденной по ключу в структурированном списке.

(stq who ‘((ferst john) (mid q) (last public)))

(assoc ‘first who)

) возвращает (FIRST JOHN)

(setq new ‘(first j)) возвращает (FIRST J)

(setq new old who) возвращает ((FIRST J) (MID Q) (LAST PUBLIC))

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

(substr «abcde» 2) возвращает «bcde»

(substr «abcde» 2 1) возвращает «b»

(substr «abcde» 3 2) возвращает «cd»

Эта функция печатает новую строку на экране. Она также возвращает новую строку. TERPRI не используется для ввода/вывода файлов. Для записи новой строки в файл используйте PRINT или PRI NC.

Функция TEXTSCR переключает экран с графического в текстовой режим в одно-экранных системах (как функциональная клавиша «FLIP SCREEN» в AutoCAD). TEXTSCR всегда возвращает nil. Смотрите также функцию GRAPHSCR.

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

(trase my-func) возвращает MY-FUNC

и устанавливает символ трассировки для функции MY-FUNC. Смотрите также функцию UNTRACE.

Эта функция возвращает TYPE (тип) , где TYPE — одно из следующих значений (как атом):

REAL числа с плавающей запятой

FILE описатель файлов

STR строковые константы

INT целые величины

LIST списки (и функции пользователя)

SUBR внутренние функции AutoLISP

PITCKSET наборы AutoCAD

ENAME имена примитивов AutoCAD

PAGETB таблица диспетчера страниц

(setq a 123 r 3.45 s «Hello!» x ‘(a b c))

(setq f (open «name» «r»))

(type ‘a) возвращает SYM

(type a) возвращает INT

(type f) возвращает FILE

(type r) возвращает REAL

(type s) возвращает STR

(type x) возвращает LIST

(type +) возвращает SUBR

Следующий пример иллюстрирует использование функции TYPE.

(if (= (type a) ‘INT) ; является ли тип целым?

Т ; если да — верни Т

nil ; если нет — верни nil

Эта функция убирает символ трассирования для указанных функций и возвращает имя последней функции. Она выборочно исключает пошаговое трассирование .

(untrace my-func) возвращает MY-FUNC

и убирает символ трассировки для функции MY-FUNC. Смотрите также TRACE.

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

«AutoLISP Release X.X»

где Х.Х — номер текущей версии. Например:

(ver) возможный возврат «AutoLISP Release 9.0»

Эта функция вычисляет и, если оно не является nil, вычисляет другие выражения, затем снова проверяет . Это продолжается до тех пор, пока не nil. Затем WHILE возвращает самое позднее значение последнего .

будет вызвана функция пользователя SOME-FUNC десять раз, с А равным от 1 до 10. Будет затем возвращено 11, что является значением последнего выражения.

Эта функция записывает один символ на экран или в открытый файл, заданный . ) — это код ASII символа, и является значением возвращаемым функцией.

(write-char 67) возвращает 67 и записывает латинскую букву С на экране.

Предположим, что F — описатель открытого файла:

(write-char 67 f) возвращает 67 и записывает латинскую букву С в этот файл.

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

(write-line «Test» f) записывает Test и возвращает «Test».

Эта функция возвращает T, если действительное или целое число, равное нулю, иначе возвращает nil. Она не определена для других типов .

(zerop 0) возвращает Т

(zerop 0.0) возвращает Т

(zerop 0.0001) возвращает nil

Это, определяемая пользователем функция, трактующая ошибки. Если она не nil, она выполняется как функция всякий раз, когда присутствует проверка ошибок AutoLISP. Она выдает один аргумент — строку, состоящую из описания ошибки.


(defun *error* (msg)

Эта функция будет делать то же самое, что и стандартная функция трактовки ошибок AutoLISP — печать «error:» и описание.

ПРИМИТИВЫ И МЕХАНИЗМ ДОСТУПА

Всеобъемлющие функции AutoLISPа «set» обеспечивают доступ к примитивам AutoCADа, к графическому экрану и к механизмам ввода. Вы можете выбирать примитивы , восстанавливать их величины и модифицировать их. Наборы выбора (selection — sets ) можно поместить в переменные LISPа, это позволяет работать коллекции примитивов. Для прямого создания примитивов нет функций, однако можно использовать функцию COMMAND , чтобы подчиниться обычным командам AutoCAD для выполнения этого.

Два специальных типа данных AutoLISPа являются инструментом , обеспечивающим доступ к примитивам AutoCAD: имя примитива ( entity name ) и набор выборa ( selection — set ). Этими типами данных манипулируют только функции , которые действуют на основании их , и их внутренняя структура не касается программиста LISP. Имя примитива имеет значение в указателе файла, обслуживающем редактор чертежей AutoCAD, в котором AutoLISP может найти базу данных примитивов или их векторы (если есть вывод на экран). Наборы выбора это просто коллекция имен примитивов.

Имена примитивов и наборы выбора действительны только в течение сеанса редактирования , в котором они применяются AutoCADом.

Следующие функции выполняют различные действия на основании функции selection — sets (наборы выбора ).

Вы можете применять функцию selection — set c функцией SSGET. Аргументом является строковая константа , которая означает тип выполняемого выбора примитива . Это могут быть буквы » W » , » C » , » L» , или » P » , названия режимов в AutoCADе » Window» (окно) , Crossing «(пересечение) , » Last » (последний), » Previous» (предыдущий). и это аргументы точки в списках , которые определяют точки , уместные для выбора. Обозначение точки без аргумента эквивалентно выбору примитива указанием единственной точки. Если все аргументы опущены , SSGET подскажет пользователю через механизм AutoCADа » Select objects: «(выберите объекты) , позволяя интерактивный выбор набора.

(ssget) Спрашивает пользователя общий выбор примитива

(ssget «P») Выбирает самый новый выбранный набор.

(ssget «L») Выбирает последний примитив, прибавленный к базе данных.

(ssget ‘(2 2)) Выбирает примитив, проходящий через точку 2 , 2 .

(ssget «W» ‘(0 0) ‘(5 5)) Выбирает примитивы внутри окна с координатами точек 0, 0 5 ,5 .

(ssget «C» ‘(0 0) ‘(1 1)) Выбирает примитивы, пересекающие бокс с координатами точек 0 , 0 1 , 1 .

Выбранные объекты высвечиваются, когда SSGET используется без аргументов. Нет информации о том, сколько выбранных примитивов сохраняется (как альтернативу смотри функцию ENTSEL , описанную ниже). Selection -sets временно поглощают щели файла AutoCAD , поэтому LISPу не разрешается иметь более 6-и одновременно открытых файлов. Если этот предел достигнут , AutoCAD откажется создавать любые другие наборы выбора (selection -sets) и возвратит » nil » на все вызовы AutoCADа.

Переменная набора выбора может быть передана AutoCADу в ответ на любую подсказку «Select objects:» в выборе «Last». Она выберет все объекты в наборе LISPа, как бы просматривая их в окошко (обратите внимание, примитивы, выбранные этим способом не нуждаются в выводе на экран).

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

Эта функция возвращает имя примитива -го элемента набора . Если отрицательное или больше самого большего вычисляемого примитива в наборе выбора , возвращается «nil». Первый элемент набора имеет индекс «0». Имена примитивов в наборе , применяемых с функцией SSGET , всегда будут именами главных примитивов . Подпримитивы (Block attributes и Polyline vertices) не будут возвращаться ( но, смотри описанную ниже функцию ENTNEXT, которая делает доступными их).

Если вызывается без аргументов, функция SSADD создает новый набор выбора без членов. Если вызывается с единственным аргументом имени примитива, функция SSADD создает новый набор выбора, содержащий это единственное имя примитива. Если вызывается с именем примитива и с набором выбора, она добавляет имя примитива к набору. Функция SSADD всегда возвращает новый или модифицированный набор. Запомните, что при добавлении примитива к набору, новый примитив физически присоединяется к существующему набору, и набор, проходящий как , возвращается, как результат. Таким образом, если другим переменным присваивается категория — набор, они будут отражать также сложение. Если в наборе уже есть примитив с таким же названием, действие функции SSADD будет проигнорировано; сообщения об ошибке не будет.

Функция SSDEL удаляет имя примитива из набора и возвращает имя набора . Запомните , что примитивы физически удаляются из набора , как оппозиция новому набору, возвращающемуся с удаленным элементом. Если в наборе нет примитива, возвращается «nil».

Эта функция проверяет , является ли имя примитива членом набора выбора . Если это так , функция SSMEMB возвращает имя примитива . Если нет, возвращает «nil».

Следующие функции выполняют различные действия с именем примитива, включая ввод. Имена примитивов могут проходить в AutoCADе в ответ на любую подсказку » Select objects: » , для которой ответ «Last» действителен. В результате будет выбрано название примитива , как если бы он просматривался в окошко.

Если вызывается без аргументов, эта функция возвращает имя примитива первого неудаленного примитива в базе данных. Если функция ENTNEXT вызывается с аргументом примитива , она возвращает имя первого неудаленного примитива, следующего за в базе данных. Если нет следующего примитива в базе данных, возвращается «nil». Функция ENTNEXT возвращает и главные примитивы и подпримитивы.

Примитивы , выбранные функцией SSGET — главные примитивы, нет атрибутов блоков или вершин полилиний. Вы можете добраться до внутренней структуры этих сложных примитивов посредством простого приема, через подпримитивы, функцией ENTNEXT. Если вы однажды примените имя подпримитива, вы можете действовать подобным образом в любом другом случае. Если вы приобрели имя подпримитива через функцию ENTNEXT, вы можете найти родительский примитив, двигаясь вперед от функции ENTNEXT до функции SEQEND, чтобы обнаружить примитив, затем извлекая -2 группу из такого примитива, который является главным именем примитива.

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

Она иногда желательна, как действие на примитивы, чтобы одновременно выбрать примитив и обозначить точку, с помощью которой примитив был выбран. Примеры этого в AutoCADе можно найти в функции Object Snap и в командах BREAK , TRIM , EXTEND . Функция ENTSEL позволяет программам AutoLISPа выполнить это действие. Функция ENTSEL выбирает отдельный примитив, требуя, чтобы выбор был сделан точкой. Она возвращает список, в котором первый элемент — имя выбранного примитива, второй элемент — координаты точки, используемой для выбора примитива. Если строка содержит , эта строка может быть использована, чтобы спросить пользователя о примитиве. Иначе, по умолчанию появится подсказка «Select object:» . Следующий диалог иллюстрирует использование функции ENTSEL и возвращаемый список.

From point: 1 , 1

To point: RETURN

Command: (setq e (entsel «Please choose an entity:»))

Please choose an entity: 3 , 3

Возвращаемая функцией ENTSEL форма в виде списка , удовлетворяет AutoCAD в ответ на любую его подсказку выбрать объект. Это будет трактоваться AutoCADом , как выбор определенного примитива , указанного точкой.

Следующие функции позволяют вам восстановить и модифицировать данные определенных примитивов. Имена примитивов применяются для того, чтобы определить примитивы, с которыми надо работать.

Удаляет примитив, обозначенный , в текущем чертеже, или восстанавливает примитив, если он был предварительно удален в этом сеансе редактирования. Удаляемые примитивы вычищаются из чертежа, покидая редактор чертежей, итак, функция ENTDEL может восстанавливать их только в течение сеанса редактирования, когда они были удалены. Функция ENTDEL работает только в главных примитивах, атрибуты и вершины полилиний не могут быть удалены, независимо от их родительских примитивов (вы можете использовать функцию COMMAND , чтобы работать функцией ATTEDIT, или команду PEDIT, чтобы выполнить это).

Примитив, который называется восстанавливается из базы данных и возвращается как список, содержащий эти определяемые данные. Результирующий список кодируется, как структурированный список LISP, элементы которого могут быть легко восстановлены функцией ASSOC. Объекты в результирующем списке кодируются в кодах DXF системы AutoCAD для каждой части входных данных. Для примера рассмотрим вычерчивание, и затем восстановление LINE следующей последовательностью команд:

From point: 1 , 2

To point: RETURN

Command: (setq a (entget (entlast)))

установит А, равное списку ( делает останов для прочтения ):

(10 1.000000 2.000000)

(11 6.000000 6.000000)

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

Отдельные точечные пары, представляют переменные, которые могут быть легко восстановлены с помощью функции ASSOC, функция CDR обычно выводит их значения. Коды для компонентов примитива те же самые, что использует DXF, и приводятся в приложении С Руководства AutoCAD. Так же, как в DXF, заголовок элемента примитива ( цвет и тип линии, сложный примитив флага (функция ATFLAG), экструзия толщины и выключение набора Z) выводится , если переменная не по умолчанию. В функциях, не таких как DXF, не обязательно выводить точность поля примитива, равную ли их значениям по умолчанию или нет. Намерение сделать это является упрощенным вариантом программ, которые всегда могут принимать эти поля присутствующими для основных алгоритмов, по которым они работают.

Запомните, что подсписки для точек — это не точечные пары, подобные остальным. Соглашением является то, что функция CDR подсписка — это групповая переменная. Так как точка- это список двух действительных чисел, это составляет всю совокупность трех элементов списка. Функция CDR группы является списком, изображающим точку, соглашением является также, то что функция CDR всегда возвращает переменную сохраненной.

Когда описываемые функции обрабатывают эти списки, обязательно сделайте им аккуратные подсписки. Польза для функции ASSOC от этого гарантирована. Группа -1,содержащая имя примитивов, позволяет произвести некоторые действия, чтобы просто принять список примитива, и избежать необходимости сохранять имя примитива в параллельной структуре. Примитив SEQEND в конце Poliline или набор аттрибутов содержит -2группу, чьи CDR являются заголовком в этом примитиве. Это позволит найти заголовок в подпримитивах, двигаясь вперед к SEQEND, затем, используя функцию CDR -2 группы, как имя примитива, восстановить структурированный главный примитив. Следующий пример хорошо иллюстрирует комплексные примитивы, представленные как список.

New current elevation : 3.5

New current thickness : 0

?/Create /Load/Set: SET

New entity linetype : DASHED

New entity color : BLUE

New current layer : ANNOTATION

Start point or Align/Center/Fit/Middle/Right/Style: 2 ,2

Rotation angle : 30

Text: So long , and thanks for all the fish!

Command: (setq e (entget (entlast)))

В этом случае Е будет устанавливать в списке то, следует ниже.

Рассмотрение приложения С Руководства к AutoCADу придаст смысл этому ясному списку.

(10 2.000000 2.000000)

(1 . «So long , and thanks for all the fish!»)

(11 0.000000 0.000000)

Список проходит функцию ENTMOD, в формате возвращающей его функции ENTGET, и обновляет информационную базу данных примитива, имя которого определено совокупностью -1 в . Однако, главный механизм, с помощью которого LISP обновляет базу данных, это восстановление примитивов функцией ENTGET, модификация списка, определяющего примитив ( запомните, что для этого очень полезна функция SUBST AutoLISPа) и обновляющего примитив в базе данных с помощью функции ENTMOD.

Функция ENTMOD имеет некоторые ограничения по изменениям, которые она делает. Во — первых, нельзя изменять типы примитивов . (Если вы хотите сделать это, примените только функцию ENTDEL и сделайте новый примитив командой COMMAND ). AutoCAD должен знать все объекты, которые упоминаются в списке примитивов, до того как выполнена функция ENTMOD. Так, стиль текста, тип линии, форма и имена блоков должны быть предварительно определены в чертеже, до того, как функция ENTMOD может их использовать в списке примитивов. Исключением в этом случае является имя уровня, __ENT M OD освободит новый уровень по умолчанию, используя команду «LAYER NEW», если в этом списке указывается предварительно не определенный уровень.

Функция ENTMOD выполняет некоторую последовательность действий, как команда DXFIN, проверяя список, содержит ли он, данные из файла DXF. Если обнаружена серьезная ошибка, такая серьезная,что база данных не обновляется, возвращается «nil». В противном случае, функция ENTMOD возвращает список в качестве аргумента. Функция ENTMOD не изменит внутренние поля, такие как имя примитива в совокупности -2 функции SEQEND, попытки изменить такие поля просто игнорируются.

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

Как описано выше, когда функция ENTMOD модифицирует вершины полилиний или аттрибуты блоков, полный комплект примитива не обновляется на экране. Например, если были модифицированы 100 вершин сложных полилиний, пересчет и перечерчивание Polyline, так же как и каждой вершины, которая была изменена, будет сделано неприемлемо медленно. Обычно, можно применить функцию ENTUPD, чтобы модифицированную Polyline или блоки обновить на экране. Функция ENTUPD назовет именем примитива любую часть Poliline или блока. Нет необходимости иметь заголовок примитива, функция ENTUPD найдет заголовок. Когда функция ENTUPD предназначена для полилиний и аттрибутов блоков, ее можно вызвать для любого примитива. Она всегда будет восстанавливать примитив на экране, включая все подпримитивы.

Имена примитивов ( entity names ) и наборы выбора ( selection- sets ) действительны только в течение сеанса редактирования,в котором они применяются в AutoCADе. Так, если вы попытаетесь произвести какие-нибудь последующие действия, пока активны команды PLINE или ATTEDIT, будет возвращено » nil» и запрос функции не будет выполнен.

ENTMOD чтобы модифицировать существующий примитив

ENTUPD чтобы восстановить модифицированный сложный примитив

ENTDEL чтобы не удалять и восстановить уничтоженный примитив

Имена примитивов (entity name) и наборы выбора (selection-sets) необходимы для того, чтобы ввести из LISPа объекты выбора в ответ на подсказку. Таким образом, примитивы, названные LISPом, могут работать по командам AutoCADа. Подсказку «Select objects:» LISP может снабдить именем примитива, который определяет единственный примитив или набор выбора, чтобы выбрать все примитивы в наборе. Передача имен примитивов и набора выбора из LISPа возможна в выборе «Last»(обе части, как способность выбирать примитивы, не взирая на видимость, так и не специфицировать выбранные точки).

Всякий раз, когда AutoCAD позволяет сделать выбор объекта точкой, списки в программе, возвращаемые функцией ENTSEL, допустят процедуру выбора. Они выбирают примитив из списка, определяя точку в списке, как выбранную точку. Это позволяет LISPу перейти к вводу выбранных точек такими командами, как BREAK, TRIM и EXTEND. Помните, что списки формы ENTSEL могут использоваться для других выборов тоже, так же точно, как точка, выбираемая позволяющей командой. Списки формы ENTSEL не могут использоваться с командами FILLET и CHAMFER, которые применяют два примитива и точки из механизма выбора.

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

Эта функция используется для просмотра всех таблиц символов. Первый аргумент — это идентификатор символа интересующей вас таблицы. Действительны имена «LAYER» , «LTYPE» , «VIEW», «STYLE» и «BLOCK»: Именам не нужен верхний регистр. Когда присутствует второй аргумент, и не «nil», таблица символов переводится на начало и первый элемент в ней восстанавливается, в противном случае , восстанавливается следующий элемент в таблице. Когда совсем нет элементов в таблице, возвращается «nil». Удаленные элементы таблицы не возвращаются.

Когда элемент обнаружен, он возвращается, как список точечных пар DXF кодов и значений , подобно тому ,который возвращает функция ENTGET.

(tblnext «layer» T) восстанавливает первый уровень

((0 . «LAYER») символьный тип

(2 . «0») имя символа

(62 . 7) цвет, негатив выключен

(6 . «CONTINUOUS») тип линии

Обратите внимание , что совокупности «-1» нет. AutoCAD запоминает: последний элемент , возвращаемый из таблицы, и просто возвращает один из следующих элементов ,при каждом вызове TABNEXTом этой таблицы. Когда вы начинаете просмотр таблицы , вы должны быть уверены , что второй аргумент не «nil», чтобы перемотать таблицу и вернуть первый элемент . Элементы, восстановленные из таблицы » BLOCK» , включают в себя : совокупность «-2» c именем первого примитива в определении блока (или любого).

Итак, назовем блок «BOX»:

(tblnext «block») восстанавливает определение блока

((0 . «BLOCK») тип символа

(2 . «BOX») имя символа

(10 9.000000 2.000000 0.000000) Х,У,Z

(-2 . первый примитив

Имя примитива в совокупности «-2» принимается функциями ENTGET и ENTNEXT ,но ни какими другими функциями. Это значит, что вы не можете модифицировать такой примитив функцией ENTMOD или использовать функции: SSADD или ENTSEL , чтобы поместить его в selectin-set. Применяя совокупность «-2″имени примитива в функции EN T NEXT, вы можете сканировать примитивы, сжимая определения блока; функция ENTNEXT возвращает «nil» после последнего примитива в определение блока.

Эта функция просматривает таблицу символов, идентифицируемую

(то же самое, что функция TBLNEXT), отыскивая имя символа присвоенного . Оба имени автоматически приводятся к верхнему регистру. Когда обнаружено имя элемента, подобное тому, которое дал , эта запись возвращается в формате, описанном функцией TBLNEXT. Если такой элемент не обнаружен, возвращается «nil»

(tblsearch «style» «standard») устанавливает стиль текста

((0 . «STYLE») тип символа

(2 . «STANDARD») имя символа

(40 . 0.000000) фиксирование высоты

(41 . 1.000000) фактор ширины

(50 . 0.000000) угол

(71 . 0) генерирование флажков

(3 . «txt») самый первый font file

(4 . «») большой font file

Порядок вводов восстановлен из TBLNEXT без воздействия функции TBLSEARCH.

Доступ к графическому экрану и устройствам ввода

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

однако, нет нужды касаться этого. Эти функции только для опытных пользователей. Большинству применений LISPа не нужны эти функции. Пользователей предупреждаем, что действия этих функций могут быть изменены от выпуска к выпуску системы AutoCAD и, следовательно, Autodesk, поэтому нет гарантии указанной выше совместимости применений этих функций. Применение функций GRTEXT и GRREAD также может быть неподходяще, для работы на любой жесткой конфигурации, если пользователь не очень внимателен, чтобы аккуратно следовать правилам их использования, приведенным ниже.

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

Функция GRDRAW вычерчивает вектор между двумя точками . и являются точками (списки из двух действительных чисел), которые определяют конечные точки вектора. Конечные точки определяются, как плавающие точки для вычерчивания координат и будет clipped, как требование, чтобы вывести на экран. Вектор будет нарисован с цветным выводом, если аргумент целое число, определяемое в группе -1 в «XOR ink», которая заканчивает любое его вычерчивание и уничтожается, когда перечерчено. Если аргумент целое число и не «0», будет нарисован вектор так, как механизм дисплея высветит выбранные объекты ( обычно поточечно ). Если пропущен или имеет значение 0, будет использован нормальный режим вывода на экран.

Функция GRTEXT позволяет AutoLISPу выводить текст частями на графический экран в AutoCADе. Если вызывается с аргументом от 0 и до самого высокого численного значения бокса в меню экрана минус 1, функция выведет на экран дисплея строковый аргумент

, в указанный в меню бокс . Текст

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

Запомните, что эта функция просто выводит на экран дисплея текст, находящийся в площади экрана ; она не изменяет элементы экранного меню.

Если функция GRTEXT вызывается боксом номер -1, текст будет выведен на экран в режиме статуса линии . Длина линии зависит от дисплея ( большинство их допускает, по крайней мере, 40 разновидностей, за исключением замечательного Color Graphics Adaptor фирмы IBM ). Текст будет сокращен, чтобы пригнать его к имеющемуся в распоряжении пространству .

Если используется бокс с номером -2, текст будет написан в координатах статуса линии. Запомните, что если слежение координат включено, величины, записанные в это поле, перепишутся, как только указатель пошлет другой набор координат. Каждый из номеров, -1 или -2, игнорирует аргумент , если он присутствует . Наконец, функция DRTEXT может быть вызвана без аргументов, чтобы восстановить всю площадь текста на экране, с его стандартными переменными.

Функция GRREAD позволяет вам непосредственно следить за механизмом входа AutoCADа, выслеживая указанные механизмы, когда они изменяются. Этой функции нужны только специфические команды, большинство входов в AutoLISP пройдут через различные функции GETxxx, такие как GETSTRING, GETREAL и подобные. Аргумент, если он имеется и не «nil», дает возможность вернуть координаты из указанных механизмов, когда они двигаются, не требуя выбора нажатием клавиш. Этот механизм AutoCAD обычно использует для протягивания.

Функция GRREAD возвращает список, в котором первый элемент это код, определяющий тип входа. Второй элемент списка — любое целое число или список точек, зависящих от типа входа .Коды для первого элемента в списке следующие:

характеризует клавиатуру — в кодах ASCII, также и для второго элемента

выбираемая точка — координаты, как список выбираемый элемент меню экрана — номер бокса, также и для второго элемента

режим протягивания координат, также и для второго элемента. Возвращается только, если второй аргумент определен и он не»nil»

BUTTONS выбираемый пункт меню — номер клавиши это второй элемент

TABLET1 оцифровываемый пункт меню — номер бокса это второй элемент

TABLET2 оцифровываемый пункт меню — номер бокса это второй элемент

TABLET3 оцифровываемый пункт меню — номер бокса это второй элемент

TABLET4 оцифровываемый пункт меню — номер бокса это второй элемент

AUXI оцифровываемый пункт меню — номер бокса это второй элемент

координаты, связанные с указателем клавиш, возвращаемые, как второй элемент. Всегда следует тип 6 , чтобы возвратить список

выбор высвеченного пункта меню экрана при помощи ввода с клавиатуры

Ввод CTRL C в то время как идет GRREAD , вызовет прерывание (abort) LISP программы с клавиатуры. Любой другой вход пройдет прямо к GRREAD ,давая этим возможность закончить контроль над механизмом входа.

Delphi-Help

Nil

Описание

const Nil = Pointer(0);

Константа Nil — значение не присвоенного указателя.

Использование нулевого (Nil) указателя приводит к исключению.

Nil используется главным образом как замена параметра Указателя — это говорит программе, что параметру присвоено значение не указателя.

Указательные переменные не установлены на Nil, кроме как в специальных обстоятельствах, типа при создании нового объекта, который содержит указатели. Это потому, что Delphi инициализирует память, взятую для нового объекта с 0-ми. Нулевой (Nil) указатель — тот, который имеет значение 0.

Пример кода

var
myPtr : PChar;

begin
// Переменные указатели, по умолчанию, на nil не установлены
if myPtr = Nil
then ShowMessage(‘myPtr = nil’)
else ShowMessage(‘myPtr not nil’);

// Так что мы должны установить их на ноль, чтобы убедиться, что они неопределены
myPtr := Nil ;
if myPtr = Nil
then ShowMessage(‘myPtr = nil’)
else ShowMessage(‘myPtr not nil’);
end;

Nil — Константа

In Emacs Lisp, certain symbols normally evaluate to themselves. These include nil and t , as well as any symbol whose name starts with ‘ : ’ (these are called ). These symbols cannot be rebound, nor can their values be changed. Any attempt to set or bind nil or t signals a setting-constant error. The same is true for a keyword (a symbol whose name starts with ‘ : ’), if it is interned in the standard obarray, except that setting such a symbol to itself is not an error.

function returns t if object is a symbol whose name starts with ‘ : ’, interned in the standard obarray, and returns nil otherwise.

These constants are fundamentally different from the constants defined using the defconst special form (see Defining Variables). A defconst form serves to inform human readers that you do not intend to change the value of a variable, but Emacs does not raise an error if you actually change it.

A small number of additional symbols are made read-only for various practical reasons. These include enable-multibyte-characters , most-positive-fixnum , most-negative-fixnum , and a few others. Any attempt to set or bind these also signals a setting-constant error.

Pascal-Паскаль

Программирование. Динамические списки Pascal-Паскаль

  • Скачено бесплатно: 6843
  • Куплено: 414
  • Pascal-Паскаль->Программирование. Динамические списки Pascal-Паскаль

Программирование. Динамические списки Pascal-Паскаль

Динамические структуры данных

Объект данных обладает динамической структурой, если его размер изменяется в процессе выполнения программы или он потенциально бесконечен.

Классификация структур данных

Используемые в программировании данные можно разделить на две большие группы:

Данные статической структуры – это данные, взаиморасположение и взаимосвязи элементов которых всегда остаются постоянными.

Данные динамической структуры – это данные, внутреннее строение которых формируется по какому-либо закону, но количество элементов, их взаиморасположение и взаимосвязи могут динамически изменяться во время выполнения программы, согласно закону формирования.

Данные динамической структуры:

К данным динамической структуры относят файлы, несвязанные и связанные динамические данные.

Заметим, что файлы в данной классификации отнесены к динамическим структурам данных. Это сделано исходя из вышеприведенного определения. Хотя удаление и вставка элементов в середину файла не допускается, зато длина файла в процессе работы программы может изменяться – увеличиваться или уменьшаться до нуля. А это уже динамическое свойство файла как структуры данных.

Статические и динамические переменные в Паскале

В Паскале одной из задач описания типов является то, чтобы зафиксировать на время выполнения программы размер значений, а, следовательно, и размер выделяемой области памяти для них. Описанные таким образом переменные называются статическими.

Все переменные, объявленные в программе, размещаются в одной непрерывной области оперативной памяти – сегмент данных. Длина сегмента данных определяется архитектурой микропроцессора и составляет обычно 65536 байт.

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

Предположим, например, что у вас есть программа, требующая массива в 400 строк по 100 символов каждая. Для этого массива требуется примерно 40К, что меньше максимума в 64К. Если остальные ваши переменные помещаются в оставшиеся 24К, массив такого объема проблемы не представляет. Но что если вам нужно два таких массива? Это потребовало бы 80К, и 64К сегмента данных не хватит. Другим общим примером является сортировка. Обычно когда вы сортируете большой объем данных, то делаете копию массива, сортируете копию, а затем записываете отсортированные данные обратно в исходный массив. Это сохраняет целостность ваших данных, но требует также наличия во время сортировки двух копий данных.

С другой стороны объем памяти компьютера достаточно велик для успешного решения задач с большой размерностью данных. Выходом из положения может служить использование так называемой динамической памяти.

Динамическая память (ДП) – это оперативная память ПК, предоставляемая программе при ее работе, за вычетом сегмента данных (64 Кб), стека (16 Кб) и собственно тела программы. Размер динамической памяти можно варьировать. По умолчанию ДП – вся доступная память ПК.

ДП – это фактически единственная возможность обработки массивов данных большой размерности. Многие практические задачи трудно или невозможно решить без использования ДП. Например, при разработке САПР статическое распределение памяти невозможно, т.к. размерность математических моделей в разных проектах может значительно различаться.

И статические и динамические переменные вызываются по их адресам. Без адреса не получить доступа к нужной ячейке памяти, но при использовании статических переменных, адрес непосредственно не указывается. Обращение осуществляется по имени. Компилятор размещает переменные в памяти и подставляет нужные адреса в коды команд.

Адресация динамических переменных осуществляется через указатели. Их значения определяют адрес объекта.

Для работы с динамическими переменными в программе должны быть выполнены следующие действия:

  • Выделение памяти под динамическую переменную;
  • Инициализация указателя;
  • Освобождение памяти после использования динамической переменной.

Программист должен сам резервировать место, определять значение указателей, освобождать ДП.

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

Указатели

Для работы с динамическими программными объектами в Паскале предусмотрен ссылочный тип или тип указателей. В переменной ссылочного типа хранится ссылка на программный объект (адрес объекта).

Указатель – это переменная, которая в качестве своего значения содержит адрес байта памяти.

Объявление указателей

Указатель, связанный с некоторым определенным типом данных, называют типизированным указателем. Его описание имеет вид:

Пример фрагмента программы объявления указателя


Указатель, не связанный с каким-либо конкретным типом данных, называется нетипизированным указателем. Для описания нетипизированного указателя в Паскале существует стандартный тип pointer. Описание такого указателя имеет вид:

С помощью нетипизированных указателей удобно динамически размещать данные, структура и тип которых меняются в ходе выполнения программы.

Значения указателей – адреса переменных в памяти. Адрес занимает четыре байта и хранится в виде двух слов, одно из которых определяет сегмент, второе – смещение.

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

Пример фрагмента программы объявления указателя различных типов

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

Выделение и освобождение динамической памяти

Вся ДП рассматривается как сплошной массив байтов, который называется кучей.

Расположение кучи в памяти ПК.

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

  • Heaporg – начало кучи;
  • Heapend – конец кучи;
  • Heapptr – текущая граница незанятой ДП.

Выделение памяти под динамическую переменную осуществляется процедурой:

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

Пример фрагмента программы объявления указателя различных типов

Графически действие процедуры new можно изобразить так:

Освобождение динамической памяти осуществляется процедурой:

Следует помнить, что повторное применение процедуры dispose к свободному указателю может привести к ошибке.

Процедура dispose освобождает память, занятую динамической переменной. При этом значение указателя становится неопределенным.

Любые действия над указателем в программе располагаются между процедурами new и dispose.

При использовании динамически распределяемых переменных часто возникает общая проблема, называемая утечкой динамической памяти. Утечка памяти – это ситуация, когда пространство выделяется в динамически распределяемой памяти и затем теряется – по каким-то причинам ваш указатель не указывает больше на распределенную область, так что вы не можете освободить пространство. Общей причиной утечек памяти является переприсваивание динамических переменных без освобождения предыдущих. Простейшим случаем является следующий:

Пример фрагмента программы

При первом вызове New в динамически распределяемой памяти выделяется 2 байта, и на них устанавливается указатель IntPointer. Второй вызов New выделяет другие 2 байта, и IntPointer устанавливается на них. Теперь у вас нет указателя, ссылающегося на первые 2 байта, поэтому вы не можете их освободить. В программе эти байты будут потеряны.

Присваивание значений указателю

Для инициализации указателей существует несколько возможностей.

  • процедура new отводит блок памяти в области динамических переменных и сохраняет адрес этой области в указателе;
  • специальная операция @ ориентирует переменную-указатель на область памяти, содержащую уже существующую переменную. Эту операцию можно применять для ориентации на статическую и динамическую переменную.
    Например,

Операции с указателями

Для указателей определены только операции присваивания и проверки на равенство и неравенство. В Паскале запрещаются любые арифметические операции с указателями, их ввод-вывод и сравнение на больше-меньше.

Еще раз повторим правила присваивания указателей:

  • любому указателю можно присвоить стандартную константу nil, которая означает, что указатель не ссылается на какую-либо конкретную ячейку памяти;
  • указатели стандартного типа pointer совместимы с указателями любого типа;
  • указателю на конкретный тип данных можно присвоить только значение указателя того же или стандартного типа данных.

Указатели можно сравнивать на равенство и неравенство, например:

В Паскале определены стандартные функции для работы с указателями:

  • addr( x) – тип результата pointer, возвращает адрес x (аналогично операции @), где x – имя переменной или подпрограммы;
  • seg( x) – тип результата word, возвращает адрес сегмента для x;
  • ofs( x) – тип результата word, возвращает смещение для x;
  • ptr( seg, ofs) – тип результата pointer, по заданному сегменту и смещению формирует адрес типа pointer.

Присваивание значений динамическим переменным

После того, как динамическая переменная объявлена, ей можно присваивать значения, изменять их, использовать в выражениях и т.д. Для этого используют следующее обращение: переменная_указатель^. Такое обращение называется операция разадресации (разыменования). Таким образом происходит обращение к значению, на которое указывает указатель, т.е. к данным. Если же за переменной_указателем значок ^ не стоит, то имеется в виду адрес, по которому расположены данные.

Динамически размещенные данные можно использовать в любом месте программы, где допустимо использование выражений соответствующего типа.

Недопустимо использовать выражения, подобные следующим:

Адрес -R:= sqr( R^) + I^ -17 R^:= sqr( R) Пример описания списка

В Паскале существует основное правило: перед использованием какого-либо объекта он должен быть описан. Исключение сделано лишь для указателей, которые могут ссылаться на еще не объявленный тип.

Формирование списка

Чтобы список существовал, надо определить указатель на его начало.

Пример описания списка

Создадим первый элемент списка:

Продолжим формирование списка. Для этого нужно добавить элемент либо в конец списка, либо в голову.

А) Добавим элемент в голову списка. Для этого необходимо выполнить последовательность действий:

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

Б)Добавление элемента в конец списка. Для этого введем вспомогательную переменную, которая будет хранить адрес последнего элемента. Пусть это будет указатель с именем hv (хвост).

Просмотр списка

Удаление элемента из списка

А)Удаление первого элемента. Для этого во вспомогательном указателе запомним первый элемент, указатель на голову списка переключим на следующий элемент списка и освободим область динамической памяти, на которую указывает вспомогательный указатель.

Б) Удаление элемента из середины списка. Для этого нужно знать адреса удаляемого элемента и элемента, стоящего перед ним. Допустим, что digit – это значение удаляемого элемента.

В)Удаление из конца списка. Для этого нужно найти предпоследний элемент.

Прохождение списка. Важно уметь перебирать элементы списка, выполняя над ними какую-либо операцию. Пусть необходимо найти сумму элементов списка.

Динамические объекты сложной структуры

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

Для устранения этого неудобства добавим в каждое звено списка еще одно поле, значением которого будет ссылка на предыдущее звено.

Динамическая структура, состоящая из звеньев такого типа, называется двунаправленным списком, который схематично можно изобразить так:

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

В программировании двунаправленные списки часто обобщают следующим образом: в качестве значения поля Next последнего звена принимают ссылку на заглавное звено, а в качестве значения поля Pred заглавного звена – ссылку на последнее звено:

Как видно, здесь список замыкается в своеобразное «кольцо»: двигаясь по ссылкам, можно от последнего звена переходить к заглавному звену, а при движении в обратном направлении – от заглавного звена переходить к последнему. Списки подобного рода называют кольцевыми списками.

Существуют различные методы использования динамических списков:

  • Стек – особый вид списка, обращение к которому идет только через указатель на первый элемент. Если в стек нужно добавить элемент, то он добавляется впереди первого элемента, при этом указатель на начало стека переключается на новый элемент. Алгоритм работы со стеком характеризуется правилом: «последним пришел – первым вышел».
  • Очередь– это вид списка, имеющего два указателя на первый и последний элемент цепочки. Новые элементы записываются вслед за последним, а выборка элементов идет с первого. Этот алгоритм типа «первым пришел – первым вышел».
  • Возможно организовать списки с произвольным доступом к элементам. В этом случае необходим дополнительный указатель на текущий элемент.

Программирование

Исходники Pascal (127)

Справочник

Справочник по паскалю: директивы, функции, процедуры, операторы и модули по алфавиту

Типизированные указатели

Типизированным называется указатель, который указывает (ссылается) на данные определенного типа. Для его объявления используется символ ^, который размещается перед соответствующим типом данных. Например:

Type mas = array[1..100] of real;

Var p1 : ^integer;

В этом случае p1 – это ссылка (указатель) на целое число, p2 – ссылка на массив из 100 вещественных чисел. Для того, чтобы обратиться к данным по этим адресам, необходимо указать: p1^, p2^. То есть, p1 – это адрес, а p1^ — то, что по этому адресу находится.

Для выделения участка динамически распределяемой памяти (кучи) в целях размещения там необходимых данных используется стандартная процедура

New (p); , где p – указатель.

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

будет выделено два непрерывных участка кучи, первый размером 2 байта (т.к. целое число занимает 2 байта оперативной памяти), второй – 400 байтов (100 * 4 байта для каждого из 100 вещественный чисел).

После выполнения этих команд указатели p1 и p2 приобрели конкретные значения. Поэтому по адресам, на которые они указывают, можно размещать конкретные значения соответствующего типа. Например,

Если в момент выполнения процедуры New в куче не окажется непрерывного участка памяти требуемого размера, то программа аварийно завершится с сообщением «Out of Memory». Для контроля размера доступного участка в динамически распределяемой памяти (куче) можно использовать функцию MaxAvail, которая возвращает размер максимального непрерывного участка кучи в текущий момент времени.

Для освобождения динамической памяти используется процедура

Dispose (p); , где p – указатель.

После выполнения такой команды память, ранее связанная с указателем, возвращается в кучу (и может быть вновь использована уже для хранения других данных). Однако значение самого указателя не меняется, т.е. в нем остается адрес «несуществующего» (уже отданного обратно в кучу) блока памяти. Поэтому обращение к указателю после выполнения команды Dispose может привести к ошибке.

В паскале существует константа Nil – пустой указатель. Значение Nil может быть присвоено любому указателю, например:

Однако выполнение такого присваивания до вызова процедуры Dispose (p2) к тому, что указатель p2 не будет ссылаться ни на какой участок динамической памяти, а данные в памяти останутся, т.е. этот участок не будет возвращен в кучу. Это плохо по той причине, что при выполнении серии таких команд значительная часть динамической памяти будет считаться занятой, но использоваться не будет.

Константа Nil необходима при работе с динамическими структурами данных, что будет рассмотрено ниже.

Нетипизированные указатели

Нетипизированным называется указатель, не связанный с каким-то конкретным типом данных. Для его описания используется стандартный тип Pointer. Например,

Нетипизированные указатели используются для динамического размещения данных, структура и тип которых могут меняться в ходе выполнения программы.

Для выделения памяти используется стандартная процедура

где p – указатель, переменная типа Pointer; size – размер выделяемого участка памяти, выражение типа Word (целочисленный тип). За одно обращение к процедуре GetMem возможно выделение не более 65521 байта памяти (максимальное значение типа Word).

Для освобождения памяти и возвращения ее в кучу используется стандартная процедура

FreeMem ( p, size );

где p – указатель, переменная типа Pointer; size – размер освобождаемого участка памяти, выражение типа Word.

Константу Nil можно использовать и при работе с нетипизированными указателями.

nil в языках программирования

Меня интересует как используется nil в различных языках программирования, и вообще насколько это удобно с точки зрения дизайна языка.

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

К примеру в JavaScript есть есть два значения похожих на nil: null и undefined. (Нужно ли было плодить?)

В Scheme есть #f, но нет nil. В Factor тоже нету nil, и используют f. (Нужен ли nil если есть false?)

Кроме того, как-то читал что вроде в первых версиях Objective-C был объект nil (Objective-C не знаю вообще), который поглощал вызовы, был чёрной дырой. Т.е. вёл себя как NaN для чисел. На любое сообщение объект возвращал nil.

В треде приветствуются:

  • Ссылки на статьи с обзором различных подходов
  • Ссылки на какие-либо интересные языки, относящиеся к теме

UPD: Насколько допустимо трактовать «пустые» объекты (пустой список, пустой словарь и т.д.) как false, и есть ли у такой фичи опасные побочные эффекты, или вообще расположение к каким-либо багам.

Универсальная функция

Определение универсальной функции

Универсальная функция EVAL , которую предстоит определить, должна удовлетворять следующему условию: если представленная аргументом форма сводится к вычислению функции, имеющей значение на списке аргументов из этой же формы, то данное значение и является результатом функции eval .

Явное определение универсальной функции позволяет достичь четкости механизмов обработки Лисп -программ.

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

Сначала этот список пуст.

Вернемся к синтаксической сводке вычислимых форм.

Ветвям этой сводки будут соответствовать ветви универсальной функции:

Кроме того работа с идентификаторами использует ассоциативный список для хранения связанных имен — значений переменных и определений функций.

Вспомогательная функция APPLY понадобилась для выделения обращений к функциям . Вспомогательная функция EVAL-A понадобилась, чтобы для EVAL завести накапливающий параметр — ассоциативный список , в котором будут храниться связи имен переменных с их значениями и названий функций с их определениями. Здесь его значение (( NIL . NIL )(T . T)) обеспечивает, что атомы NIL и T обозначают сами себя.

ASSOC и PAIRLIS уже определены ранее.

(Не допускается отсутствие истинного предиката, т.е. пустого C.)

определения функций могут накапливаться в системной переменной ObList , то есть работать как глобальные определения. ObList обязательно должна содержать глобальное определение встроенной константы » NIL » , можно и сразу разместить в ней константу «T» , выполняющую роль значения » истина «.

Поясним ряд пунктов этих определений.

Аргумент EVAL — форма. Если она — атом , то этот атом может быть только именем переменной, а значение переменной должно уже находиться в ассоциативном списке.

Если CAR от формы — QUOTE , то она представляет собой константу, значение которой выделяется как CADR от нее самой.

Если CAR от формы — COND , то форма — условное выражение . Вводим вспомогательную функцию EVCON ( определение ее будет дано ниже), которая обеспечивает вычисление предикатов (пропозициональных термов) по порядку и выбор формы, соответствующей первому предикату, принимающему значение » истина «. Эта форма передается EVAL для дальнейших вычислений.

Все остальные случаи рассматриваются как список из функции с аргументами, который обрабатывается функцией APPLY.

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

Первый аргумент APPLY — функция . Если она — атом , то существует две возможности. Атом может представлять одну из элементарных функций (CAR CDR CONS ATOM EQ) . В таком случае соответствующая ветвь вычисляет значение этой функции на заданных аргументах. В противном случае, этот атом — название ранее заданного определения функции. Определение можно найти в ассоциативном списке , подобно вычислению переменной.

Если функция начинается с LAMBDA , то ее аргументы попарно соединяются со связанными переменными, а тело определения (форма из лямбда-выражения) передается как аргумент функции EVAL-A для дальнейшей обработки.

Если функция начинается с LABEL , то ее название и определение соединяются в пару, и полученная пара размещается в ассоциативном списке, чтобы имя функции стало определенным при дальнейших вычислениях. Они произойдут как рекурсивный вызов APPLY , которая вместо имени функции теперь работает с ее определением при более полном ассоциативном списке — в нем уже размещено определение имени функции. Поскольку определение размещается «наверху» стека, оно становится доступным для всех последующих использований, то есть работает как локальный объект. Глобальные объекты, которые обеспечиваются псевдо-функцией DEFUN , устроены немного иначе, что будет рассмотрено в лекциях 5 и 6.

Определение универсальной функции является важным шагом, показывающим одновременно и механизмы реализации функциональных языков, и технику функционального программирования на любом языке. Пока еще не описаны многие другие особенности языка Лисп и функционального программирования, которые будут рассмотрены позднее. Но все они будут увязаны в единую картину, основа которой согласуется с этим определением.

  1. В строгой теории аппликативного программирования все функции следует определять всякий раз, когда они используются. На практике это неудобно. Реальные системы имеют большой запас встроенных функций (более тысячи в Clisp -е), известных языку, и возможность присоединения такого количества новых функций, какое понадобится. Во многих реализациях Лиспа все элементарные функции вырабатывают результат и на списках, и на атомах, но его смысл зависит от системных решений, что может создавать трудности при переносе программ на другие системы. Базисный предикат EQ всегда имеет значение, но смысл его на неатомарных аргументах будет более ясен после знакомства со структурами данных, используемыми для представления списков в машине.
  2. В чистом языке Лисп базисные функции CAR и CDR не определены для атомарных аргументов. Такие функции, имеющие осмысленный результат не на всех значениях естественной области определения, называют частичными. Отладка и применение частичных функций требует большего контроля, чем работа с тотальными, всюду определенными функциями . Во многих реализациях функциональных языков программирования все функции всегда вырабатывают значение. При необходимости каждый существенный класс объектов пополняется значением класса ERROR , символизирующим исключительные ситуации.
  3. Для функциональных языков характерно большое разнообразие условных форм, конструкций выбора, ветвлений и циклов, практически без ограничений на их комбинирование. Форма COND выбрана для начального знакомства как наиболее общая. За редким исключением в Лиспе нет необходимости писать в условных выражениях (QUOTE T) или (QUOTE NIL ) . Вместо них используются встроенные константы T и NIL , соответственно.
  4. В реальных системах функционального программирования обычно поддерживается работа с целыми, дробными и вещественными числами в предельно широком диапазоне, а также работа с битовыми и текстовыми строками. Такие данные, как и атомы, являются минимальными объектами при обработке информации, но отличаются от атомов тем, что их смысл задан непосредственно их собственным представлением. Их понимание не требует ассоциаций или связывания. Поэтому и константы такого вида не нуждаются в префиксе в виде апострофа.

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

Предикаты и истинность в Лиспе

Хотя формальное правило записи программ вычислений в виде S-выражения предписывает, что константа Т — это (QUOTE T) , было оговорено, что в системе всегда пишется Т . Кроме того, NIL оказался удобнее, чем атом F , встречавшийся в начальных предложениях по Лиспу аналог значения FALSE . Программист может либо принять это правило на веру, либо изучить следующие уточнения.

В Лисп есть два атомных символа, которые представляют истину и ложь, соответственно. Эти два атома — T и NIL . Данные символы — действительные значения всех предикатов в системе. Главная причина в удобстве кодирования. Во многих случаях достаточно отличать произвольное значение от пустого списка. Если атомы T и F имеют значение T и NIL , соответственно, то символы T и F в качестве константных предикатов могут работать, потому что:

Формы (QUOTE T) и (QUOTE NIL ) будут также работать, потому что:

Declared Constants

Several different language constructions are referred to as ‘constants’. There are numeric constants (also called numerals) like 17, and string constants (also called character strings or string literals) like ‘Hello world!’. Every enumerated type defines constants that represent the values of that type. There are predefined constants like True, False, and nil. Finally, there are constants that, like variables, are created individually by declaration.

Declared constants are either true constants or typed constants. These two kinds of constant are superficially similar, but they are governed by different rules and used for different purposes.

Contents

True Constants

A true constant is a declared identifier whose value cannot change. For example:

declares a constant called MaxValue that returns the integer 237. The syntax for declaring a true constant is:

where identifier is any valid identifier and constantExpression is an expression that the compiler can evaluate without executing your program.

If constantExpression returns an ordinal value, you can specify the type of the declared constant using a value typecast. For example:

declares a constant called MyNumber , of type Int64, that returns the integer 17. Otherwise, the type of the declared constant is the type of the constantExpression.

  • If constantExpression is a character string, the declared constant is compatible with any string type. If the character string is of length 1, it is also compatible with any character type.
  • If constantExpression is a real, its type is Extended. If it is an integer, its type is given by the table below.

Types for integer constants

64-bit native integer type

Range of constant (hexadecimal) Range of constant (decimal) Type Equivalent type

64-bit platforms integer type

64-bit platforms include 64-bit iOS.

Илон Маск рекомендует:  Что такое код asp querystring
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Range of constant (hexadecimal) Range of constant (decimal) Type Equivalent type