Автоматизація графічно-конструкторських робіт
.pdfЗавдання
а |
б |
в |
г |
д
е
ж
к
Завдання
а |
б |
в г
е
д
к
ж
60 |
61 |
Завдання
аб
вг
де
жк
Завдання
37 |
11 |
12 |
18 |
|
80 |
|
|
|
|
|
O105 |
M48x1,5-7H |
|
|
|
80 |
60 |
6 |
|
|
|
|
|
16 |
73 |
36 |
|
|
60 |
|
|
|
|||
|
|
115 |
|
|
|
а
O565
|
45° |
|
O390 |
|
O450 |
|
M16-6H |
812 |
O325 |
|
|
|
O362.5 |
|
462 |
|
O375 |
|
O35 |
O512
O600
O675
б
62 |
63 |
|
|
|
|
|
|
O140H8 |
128 |
|
|
|
|
|
|
64 |
|
|
|
|
|
|
|
|
|
460 |
O220 |
|
|
240 |
|
|
510 |
|
R25 |
400 |
O160 |
||||
|
|
R25 |
|
|
|
||
|
|
|
42 |
|
|
|
|
|
125 |
|
80 |
125 |
|
|
120 |
|
|
|
560 |
|
|
|
|
|
|
|
490 |
|
|
|
|
R16 |
|
|
|
|
R10 |
|
|
75 |
|
|
48 |
|
75 |
|
|
|
|
|
|
|
|
||
30 |
3 |
225 |
32 |
84 |
|
|
|
|
42 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
15 |
|
|
|
|
1x45 |
|
|
12 |
|
|
|
|
|
|
|
6 |
|
|
|
|
60 |
|
|
45 |
|
|
|
|
80 |
105 |
|
48 |
|
|
|
|
|
|
73 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
195 |
|
|
|
26 |
|
|
26 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
г |
|
64 |
|
|
|
|
|
|
|
д |
е |
65
|
|
|
|
|
Завдан н я ¹ |
7 |
|
|
|
|
ж |
|
|
|
|
|
|
3 |
|
|
O60 |
O50 H9 |
O51 |
|
M 54X2 - 7H |
O70 |
|
|
20 |
|
|
30 |
|
|
|
25 |
|
5° |
|
|
|
|
57 |
|
|
|
||
|
|
|
|
|
|
|
|
|
100 |
|
|
|
|
|
|
|
|
|
Завдан н я ¹ |
8 |
|
|
|
|
к |
|
|
2. AUTOLISP – БАЗОВА МОВА ПРОГРАМУВАННЯ В AUTOCAD
Використання в системі AutoCAD мови AutoLISP не тільки значно прискорює процес розроблення проектної документації, але і дозволяє створювати нові команди графічного редактора, спеціалізовані меню в середовищі AutoCAD, здійснювати доступ до графічної бази даних і модернізувати її, розробляти функції для розв’язання найрізноманітніших задач і, крім того, створювати ефективні системи і підсистеми, пов'язані з обробкою інформації, поданої у вигляді символів і чисел. Форми подання програми й даних, отриманих нею у AutoLISP, однакові. Програми можуть обробляти, а також перетворювати інші програми і навіть самих себе, що дозволяє ефективно використовувати LISP для розв’язання широкого кола задач.
AutoLISP – це створений спеціально для AutoCAD діалект LISP, отриманий у результаті зміни мови CommonLISP.
Мову LISP розробив 1961 року американський учений Дж. Мак-карта, вона є родоначальником функціональних мов. AutoLISP належить до так званих функціональних мов, тобто до мов, в основу яких покладено поняття функції (на відміну від звичайних операторних мов програмування – FORMAN, PASCAL, C й ін.). До таких мов відносять також, наприклад, мову PROLOG. Всі обчислення, перетворення і керування програми у функціональних мовах здійснюються за допомогою елементарних (вбудованих) функцій, обумовлених програмістом під час написання програми. Програма в цілому є суперпозицією деяких функцій і, у свою чергу, може бути використана як функція іншими програмами.
Мова LISP ідеально підійшла для AutoCAD, "передавши" AutoLISP свої дуже зручні засоби роботи з глибоко структурованою інформацією. AutoLISP – це засіб, що дозволяє програмно працювати з об'єктами AutoCAD, довідковими таблицями, зчитувати і записувати файли з AutoCAD. AutoLISP можна вважати прямим вікном у середину AutoCAD. Крім того, AutoLISP дуже простий у вивченні і дуже гнучкий.
Усе чи майже все, що ми робимо в середовищі AutoCAD вручну, можна реалізувати програмно. Для цього в AutoCAD передбачено кілька механізмів і засобів. Це, по-перше, засіб створення сценаріїв і, по-друге, використання мов програмування. В AutoCAD мовою є AutoLISP. Оскільки він зарекомендував себе в попередніх версіях як зручний і практичний засіб програмування, то AutoLISP з мовою С++ збережеться й у подальших версіях. Більше того, перш ніж приступити до
66 |
67 |
розроблення додатків мовою С++, рекомендується ознайомитися з принципами і методами створення програм мовою AutoLISP.
Як частина AutoCAD, AutoLISP дозволяє оперувати зі змінними різних типів і передавати значення командам AutoCAD під час введення даних. При відповідях на запити команд AutoCAD можна також використовувати функції AutoLISP, у яких можуть виконуватися різні арифметичні й умовні операції над числовими значеннями і значеннями визначених змінних.
Крім засобів виконання обчислень, AutoLISP містить у собі функції, що надають програмам доступ до графічної бази даних поточного креслення. AutoLISP дозволяє також керувати графічним редактором AutoCAD і звертатися до власних команд AutoCAD. За допомогою програм AutoLISP можна створювати доповнення, спрямовані на конкретну предметну область застосування функції, що поєднують у собі запити до користувача (діалог), можливість вибору за умовою декількох варіантів використання значень за замовчуванням. Хоча макровизначення, які можна створювати під час написання меню AutoCAD можуть бути досить складними і могутніми, без AutoLISP вони являють собою лише комбінації стандартних команд AutoCAD. Включенням у макровизначення меню функцій AutoLISP можна перетворити меню AutoCAD на інтелектуальний засіб автоматизації проектування.
Отже, AutoLISP дозволяє:
•використовувати змінні і вирази при відповідях на запити команд
AutoCAD;
•читати і писати зовнішні файли, у такий спосіб здійснюючи обмін із зовнішніми програмами, які можна запускати з AutoCAD;
•створювати різні функції і нові команди AutoCAD, розширюючи в такий спосіб графічні можливості усі системи;
•здійснювати програмний доступ (зчитування) до даних, які є об'єктами малюнка, а також до таблиць AutoCAD, у яких зберігається інформація про блоки, шари, види, стилі і типі ліній;
•здійснювати програмне керування графічним екраном AutoCAD і введенням/виведенням з різних пристроїв.
2.1. Основні правила мови AutoLISP
AutoLISP є конкретною реалiзацiєю мови прогрaмування LISP, вкладеної у систему AutoCAD. AutoLISP пропонує користувачам i розробникам системи AutoCAD можливiсть написання макровизначень за допомогою орiєнтованих на машинну графiку мовних засобiв високого рiвня.
68
AutoLISP розрiзняє декiлька типiв даних: списки, символи, рядки, дiйснi числа, цiлi числа, дескриптори файлiв, назви елементiв AutoCAD, назви елементiв меню, пiдпрограми (вкладенi функцiї).
Цiлi числа займаютъ 16 бiтiв пам'ятi i лежать у дiапазонi вiд мінує 32 768 до плюс 32 767. Дiйснi числа зберiгаються у форматi плаваючих чисел з подвiйною точнiстю, рядки можуть мати довiльну довжину, оскiльки пам'ять для них видiляється динамiчно.
AutoLISP має набiр вкладених функцiй, призначених для програмування двота тривимірних графiчних об'єктiв. Для роботи з координатами точок використовують такі позначення:
–точка двомірного простору зображується у виглядi списку, що складається iз пари чисел (X, Y), наприклад (3.40000 7.52000), перше число є Х-координатою, а друге – Y-координатою;
–точка тривимірного простору зображується у виглядi списку, що ска-
ладається iз трьох чисел.
AutoLISP має набiр заздалегiдь визначених функцiй, для виклику яких потрiбно ввести iм'я й аргументи (якщо вони потрiбнi).
Функцiя переводить AutoCAD в режим очiкування введення користувача. При цьому у нижньому рядку екрана виводиться пiдказка.
2.2. Функцiї введення
(setq <iм'я1> <вираз1> [<iм'я2> <вираз2>] ...)
Функцiя присвоює значення “вираз1” аргументу “iм'я1”, “вираз2” аргументу “iм'я2” i т.д. Вона повертає останнiй аргумент "вираз".
Приклад: (setq a 5.0) повертає 5.000000
(set <iм'я> <вираCз>)
Функцiя встановлює значення аргументу “iм'я” еквівалетним аргументу “вираз” i повертає цей вираз, “iм'я” є назвою символа, перед яким iде апостроф.
Приклад: (set 'a 5.0) повертає 5.000000 i визначає символ A (set (quote b) 'a) повертає A i визначає символ B
Якщо set використовується з iм'ям символа без апострофа, то вона може присвоїти непрямо нове значення iншому символу.
Наприклад, враховуючи зробленi вище визначення:
(set b 640) поверне 640 i присвоїть це значення змiннiй А.
(getcorner <точка> [<пiдказка>])
Функцiя повертає точку аналогiчно тому, як це робить GETPOINT. Відміннічть полягає в тому, що користувач задає базову точку, а функцiя повертає не її, а кутову точку, яка потрапляє у поле апертури AutoCAD. Як перший аргумент не можна використовувати який-небудь вираз LISP.
69
(getdist [<точка>] [<пiдказка>])
Функцiя запрошує ввести вiдстанi. “Пiдказка”, якщо її задано, вiдображається в нижньому рядку екрана. “Точка”, якщо задана, є базовою точкою для вiдлiку вiдстанi. Вiдстанi можна ввести з клавiатури, використовуючи поточний формат одиницi вимiру. Слiд враховувати, що яким би не був поточний формат, функцiя повертає еквiвалентне дiйсне число. Вiдстань можна ввести в графiчному режимi. Для цього достатньо вказати на екранi двi точки (якщо задано "точку", то достатньо вказати тiльки одну). AutoCAD вiдображає гумовуниткудляполегшення фiксуваннядругоїточки.
Приклад: (setq dist (getdist '(1.0 3.5) "Як далеко ?"))
Функцiя дозволяє ввести з клавiатури цiле число.
(getkword [<пiдказка>]
За допомогою цієї функцiї користувач отримує можливiсть ввести ключове слово. Список ключових слiв слід попередньо скласти за допомогою функцiї INITGET.
GETKWORD повертає введений рядок, якщо вiн збігається з ключовим словом. Якщо ж рядок не збігається нi з одним iз ключових слiв, то AutoCAD повертає запит. У результатi введення порожнього рядка функцiя повертає nil (якщо таку можливiсть передбачено завчасно).
Приклад: (initget 1 "Так Нi")
(setq Х (getkword "ви впевненi ? (Так Нi)"))
(getorient [<точка>] [<пiдказка>])
AutoLISP кути задають в радiанах. Вiссю вiдлiку кутiв є горизонталь (напрямок – злiва направо), а сам вiдлiк ведуть проти годинникової стрiлки. GETORIENT аналогiчна функцiї GETANGLE, але на вiдмiну вiд останньої, залежить вiд того, яким чином ведуть вiдлiк. Тому GETANGLE рекомендується використовувати для вiдносних, а GETORIENT – для отримання абсолютних значень кутiв.
(getpoint [<точка>] [<пiдказка>])
Функцiя дозволяє ввести точку з клавiатури. Якщо перший аргумент задано, то на екранi з'являється гумова нитка, яка зв'язує цю точку з поточним положенням курсора.
(getreal [<пiдказка>])
Функцiя зчитує з клавiатури дiйсне число i видає його. Якщо задано аргумент, то в нижньому рядку дисплея виводиться "пiдказка".
(getstring [<знак>] [<пiдказка>])
Функцiя приймає з клавiатури рядок. Якщо "знак" заданий i не nil, то всерединi рядка, який вводять, можуть мiститися пробіли (функція обо- в'язково повинна завершуватись <ENTER>).
Приклад: (setq s (getstring T "Ваше прізвище, iм'я та побатьковi? "))
70
(print1 <вираз> [<дескриптор файлу>])
Ця функцiя виводить вираз “вираз” на екран i повертає цей самий “вираз”. Першим аргументом може бути будь-який вираз; не обов'язково, щоб це був рядок. Якщо “дескриптор файлу” наявний (i є дескриптором вiдкритого для запису файлу), то “вираз” записують у файл в тому самому виглядi, в якому б вiн з'явився на екранi. Друкується тiльки заданий вираз; нiяких нових рядкiв чи пробiлiв не додається.
Наприклад, якщо: (setq a 123)
то: (print1 'a) |
друкує A |
i повертає A |
(print1 a) |
друкує 123 |
i повертає 123 |
Кожен запис попереднiх прикладiв виводиться на екран, оскільки не задавався нiякий дескриптор файлу. Якщо F є допустимим дескриптором файлу, вiдкритого для запису, то можливий запис:
(print1 а f)
(princ <вираз> [<дискриптор файлу>]
Ця функцiя подiбна до функцiї PRINІ, за винятком того, що символи керуванння у “виразi” друкують без редагування. Взагалi, PRINІ призначена для того, щоб друкувати вирази таким чином, щоб вони були зручними для користувача, а РRINC – для запису у файл, призначено для зчитування такими функцiями, як, наприклад, READ-LINE .
(print <вираз> [<дискриптор файлу>])
Ця функцiя аналогiчна функцiї PRINТ1, однак перед “виразом” виводиться новий рядок, пiсля чого – пробіл.
(terpri)
Зазначена функцiя виводить на екран порожнiй рядок. Вона повертає код символу "переведення рядка". Функцiю TERPRI не використовують для файлiв введення/виведення. Для того щоб ввести "переведення рядка" у файл, слiд користуватись функцiями PRINT або PRINC.
(prompt <повiдомлення>)
Ця функцiя вiдображує “повідомлення” в екраннiй областi пiдказок i повертає nil. Аргумент “повідомлення” є рядком. У системах з двома екранами PROMPT вiдображає повiдомлення на обох екранах i тому використовується найчастіше, ніж PRINC.
Наприклад: (prompt "New value: ")
Вiдображує "New value: " i повертає nil.
71
2.3. Математичнi функцiї
(+ <число> <число>....)
Функцiя повертає суму всiх аргументiв, якi можуть бути як цiлими числами, так i числами з плаваючою точкою.
Приклад: (+ 1 2 3 4.5) результат 10.500000
(- <число> <число> ....)
Ця функцiя повертає рiзницю першого i другого аргументiв. Якщо аргументiв бiльше двох, то обчислюється рiзниця першого i суми аргументiв, якi залишились.
Приклад: (- 50 40.0 2) результат 8.000000
(*<число> <число>...)
Функцiя повертає добуток усiх аргументiв.
Приклад: (* 2 3 4.0) результат 24.000000
(/<число> <число>...)
Функцiя повертає частку віддiлення першого аргументу на другий. Якщо є бiльше двох аргументiв, то обчислюють добуток другого, третього і т.д.
Приклад: (/ 100 20 2.0) результат 2.500000
(1+ <число>)
Функцiя збiльшує “число” на 1. Приклад: (1+ 5) результат 6
(1- <число>)
Функцiя зменшує “число” на 1.
Приклад: (l- -17.5) результат -18.5
(abs <число>)
Функцiя повертає абсолютну величину аргументу (<число>).
Приклад: (abs -99.25) результат 99.25
(atan <число1> [<число2>])
Якщо “число2” вiдсутнє, то функцiя повертає арктангенс “числа1” в радiанах.
Приклад: (atan 0.5) результат 0.463647
Якщо задають обидва аргументи, то функцiя повертає арктангенс “число1”/“число2”. Якщо “число2” дорiвнює нулю, то повертається значення 1.57... або -1.57... залежно вiд знака “числа1”.
Приклад: (atan 2.0 3.0) результат 0.588002
72
(cos <кут>)
Функцiя повертає косинус кута.
Приклад: (cos 0.0) результат 1.0000000
(sin <кут>)
Ця функцiя повертає синус “кута”.
Приклад: (sиn 1.0) повертає 0.841471
(rem <число1> <число2> ...)
Ця функцiя дiлить “число1” на “число2” и повертає залишок.
Приклад: (rem 42 12) повертає 6
(sqrt <число>)
Ця функцiя повертає квадратний корiнь “числа”.
Приклад: (sqrt 4) повертає 2.000000
(expr <число>)
Функцiя обчислює степінь числа е.
Приклад: (exp 1.0) результат 2.718282
(expt <основа> <показник>)
Функцiя підносить до степеня "показник" число "основа".
Приклад: (expt 3.0 2.0) результат 9.000000
(log <число>)
Функцiя повертає натуральний логарифм "числа".
Приклад: (log 4.5) результат 1.504077
2.4.Функцiї перетворення рядкiв
iперевiрки типiв даних
(atof <рядок>)
Функцiя перетворює рядок на дiйсне число.
Приклад: (atof "97.1") результат 97.10000
(atoi <рядок>)
Функцiя перетворює рядок на цiле число.
Приклад: (atoi "97") результат 97
(atom <елемент>)
Функцiя повертає nil, якщо елемент є списком, i Т – у протилежному випадку.
Нехай a i b встановлено таким чином:
(setq a '(x y z)) ,
тодi (atom 'a) результат Т (atom a) результат nil
73
(angtos <кут> [<режим> [<точнiсть>]])
Функцiя редагує перший аргумент, який є кутом у радiанах. Другий аргумент (“режим”) є цiлим числом i визначає тип редагування.
ANGTOS |
Режим |
Тип редагування |
|
0 |
Градуси |
|
1 |
Градуси/хвилини/секунди |
|
2 |
Вiдсотки |
|
3 |
Радiани |
Аргумент “точність” є цiлим числом, за допомогою якого задають кiлькiсть знакiв пiсля десяткової точки. Аргументи “режим” i “точність” вiдповiдають змiнним AUNITS i AUPREC.
(ascii <рядок>)
Функцiя повертає код першого символу “рядка” за таблицею ASCII.
Приклад: (ascii "a") результат 65
(boundp <атом>)
Функцiя повертає Т, якщо “атом” використовувався в операцiї присвоювання i його значенням не є nil.
Нехай (setq a 2) i (setq b nil) ,
тодi (boundp 'a) результат Т
(boundp 'b) результат nil
(chr <число>)
Функцiя повертає результат перетворення цiлого числа на рядок, який складається з одного ASCII символу.
Приклад: (chr 65) результат "A"
(fix <число>)
Функцiя повертає результат перетворення "числа" до цiлого типу.
Приклад: (fix 3.7) результат 3.000000
(float <число>)
Функцiя повертає результат перетворення "числа" до дiйсного типу.
Приклад: (float 3.7) результат 3.700000
(itoa <цiле>)
Функцiя повертає результат перетворення цiлого на рядковий формат.
Приклад: (itoa 33) результат "33"
(listp <елемент>)
Функцiя повертає Т, якщо аргумент є списком i nil – у протилежному випадку.
Приклад: (listp '(a b c)) результат T (listp '(a)) результат nil
74
(max <число> <число>...)
Функцiя повертає максимальне з "чисел"-аргументiв.
Приклад: (max -88 19 5 2) результат 19
(min <число> <число>...)
Функцiя повертає мiнiмальне із заданих "чисел".
Приклад: (min 638-10.0) результат -10.000000
(minusp <елемент>)
Функцiя повертає Т, якщо "елемент" є вiд'ємним числом, у противному разі – nil.
(numberp <елемент>)
Ця функцiя повертає T, якщо “елемент” є дiйсним або цiлим числом, i nil – у протилежному випадку.
Наприклад, якщо: (setq a 123) (setq b 'a) ,
то: (numberp |
'a) |
повертає |
nil |
(numberp a) |
повертає |
T |
|
(numberp b) |
повертає |
nil |
|
(numberp |
(eval b)) |
повертає |
T |
(null <елемент )
Ця функцiя повертає T, якщо аргумент “елемент” має значення nil i nil
– у протилежному випадку.
Приклад: (setq a 123) ,
тодi (null a) повертає nil
(setq c nil)
(null c) повертає T
(rtos <число> [<режим> [<точнiсть>]])
Ця функцiя повертає рядок, який складається з аргументу “число” відповідно до значень аргументiв “режим”, “точність” i системної змiнної
DIMZIN системи AutoCAD.
Допустимi значення аргументу “режим” можуть бути такі:
Режим |
Формат редагування |
1 |
Науковий |
2 |
Десятковий |
3 |
Технiчний (фути i десяткові частки дюймiв) |
4 |
Архiтектурний (фути i дробовi дюйми) |
5 |
Вiльнi дробовi одиниці |
Приклад: (rtos 17.5 1 4) повертає "1.7500E+01" (rtos 17.5 2 2) повертає "17.50"
75
(rtos 17.5 3 2) повертає "1'-5.50"" (rtos 17.5 5 2) повертає "17 1/2"
(strcase <рядок> [<регiстр>])
Функцiя STRCASE бере рядок, заданий аргументом “рядок”, i повертає копiю з усiма лiтерними символами, перетвореними на верхнiй або нижнiй регiстр, залежно вiд значення другого аргументу “регiстр”.
Приклад: (strcase "Sample") повертає "SAMPLE".
(strlen <рядок)
Ця функцiя повертає довжину рядка (кiлькiсть символiв)
Приклад: (strlen "abcd") повертає 4
(type <елемент>
Функцiя повертає тип аргументу <item>, де тип має одне з таких значень:
REAL – числа з плаваючою точкою; FILE – дескриптори файлiв;
STR – рядки; INT – цiлi числа; SYM – символи;
LIST – списки (i користувацькі функцiї);
SUBR – внутрiшнi функцiї AutoLISP; PICKSET – варiанти виборiв AutoCAD; ENAME – iмена примiтивiв AutoCAD;
PAGETB – таблиця розбивки функцiй на сторінки.
Наприклад: (setq a 123 s "Hello!") , тодi: (type a) повертає INT
(type s) повертає STR
Наступний приклад показує, як використовувати функцiю TYPE. (defun isint (a)
(if (= (type a) 'INT) |
; цiле число? |
T |
; так, повернiть T |
nil |
; нi, повернiть nil |
) |
|
(zerop <елемент>)
Ця функцiя повертає T, якщо аргумент “елемент” є цiлим або дiйсним числом, що дорiвнює нулю, у протилежному випадку – повертає nil. Вона не визначається для iнших типiв “елементiв”.
Приклад: (zerop 0.0) повертає T (zerop 0.00011) повертає nil
76
2.5. Логічні функції
(=<число> <число>....)
Функцiя виконує перевiрку "на дорiвнює" i повертає Т, якщо всi аргументи чисельно дорiвнюють один одному, у противному разі – повертає nil. Функцiя порiвнює i текстовi рядки.
Приклад: (= 20 388) результат nil (= 2.4 2.4 2.4) результат Т
(/= <число 1> <число 2>)
Ця функцiя є виразом вiдношення "не дорiвнює". Її визначають тiльки для двох аргументiв.
Приклад: (/= 10 20) результат Т (/= 5.43 5.43) результат nil
(<<число> <число>...) (<=<число> <число> ...) (><число> <число>...)
(>=<число> <число>....)
функції є виразами відношень “менше”, “менше або дорівнює”, “більше”, “більше або дорівнює”. Якщо умови виконуються, то функція повертає Т.
Приклад: (>= 120 17) результат Т
(>= 57 57) результат Т
(~<число>)
Функцiя утворює побітове NOT аргументу. Аргумент обов'язково має бути цiлим числом.
Приклад: (~ 3) результат –4 (~ 100) результат -101
(and <вираз>...)
Функцiя виконує операцiю логiчного додавання аргументiв (“виразiв”). Якщо значенням хоча б одного виразу є nil, то функція повертає nil, у протилежному випадку – повертає Т.
Приклад: (setq a 103) (setq b nil)
(setq c "string") ,
тодi (end 1.4 a b) повертає Т
(end 1.4 a b с) повертає nil
77
(not <елемент>)
Функцiя повертає Т, якщо значенням "елемента" є nil, i nil – у протилежному випадку. Як правило, функцiю NULL використовують для роботи зi списками, а NOT – для роботи з даними інших типiв.
Приклад: (setq a 123) (setq с nil) ,
тодi (not a) результат nil (not c) результат T
(or <вираз> ...)
Функцiя повертає результат логiчного додавання списку виразiв. Якщо всi вирази мають значення nil, то OR повертає nil, у протилежному випадку – повертає T.
Приклад: (or nil 'a '()) повертає T (or nil '()) повертає nil
(eq <вираз 1> <вираз 2>)
Функцiя з'ясовує еквiвалентнi вирази 1 i 2. EQ повертає Т, якщо вирази дорiвнюють один одному i nil – у протилежному випадку.
Приклад: (setq f1 '(a b c)) (setq f2 '(a b c))
(setq f3 f2)
тодi (eq f1 f3) результат nill (f1 и f3 не той же список)
(eq f3 f2) результат Т (f1 и f3 один i той самий список)
(equal <вираз 1> <вираз 2> <точнiсть>)
Функцiя визначає, чи дорiвнює "вираз 1" "виразу 2".
Приклад: (setq f1 '(a b c)) (setq f2 '(a b c))
(setq f3 f2) ,
тодi (eq f1 f3) результат Т (f1 i f3 є
однаковими списками)
(eq f2 f2) результат Т (f1 i f3 один i
той же список)
2.6. Функцiї для розгалуження програм
(cond (<перевірка 1> <результат 1>)...)
Функцiя припускає використання довiльної кількості елементiв списочного типу. Обчислюється перший елемент списку (у тому порядку, в якому цi списки заданi), якщо цей елемент не nil, то обчислюється вираз,
78
що складається з iнших елементiв, i повертається його значення. Якщо маємо декiлька виразiв, то повертається значення останнього, а якщо виразiв взагалi немає, тобто список мiстить один елемент, то повертається значення цього елемента.
Приклад: (cond ((= s "Y") 1) ((= s "N") 0) (t nill) )
Функцiя перевiряє склад символу S. Якщо значення дорiвнює Y або y, то виробляється 1, якщо n або N, – то 0, в iнших випадках nil.
(if <умова> <вираз 1> [<вираз 2>])
Функцiя визначає, виконується умова чи нi. Якщо"умова" не дорiвнює nil, то обчислюється “вираз 1”, iнакше “вираз 2”. “Вираз 2” не є обов'язковим. IF повертає значення вибраного виразу.
Приклад: (if (= 1 3) "ТАК" "НI") результат "НI" (if (= 2 (+ 1 3) "ТАК") результат nil
(progn <вираз> ...)
Ця функцiя послiдовно обчислює кожний вираз i повертає значення останнього виразу. Можна використовувати функцiю PROGN для обчислювання декiлькох виразiв там, де припускається обчислювати тiльки один. Наприклад:
(if (= a b) (progn (setq a (+ a 10) b (- b 10)) ) )
Якщо умовний вираз має значення, відмінне вiд nil, то функцiя IF, звичайно, обчислює тiльки один вираз. У цьому прикладi PROGN використовували для обчислювання двох виразiв.
2.7. Функцiї органiзацiї циклiв
(foreach <iм'я> <список> <вираз>...)
Функцiя здiйснює послiдовне пiдставлення елементiв списку замiсть iменi i обчислює вказанi вирази, кiлькiсть яких може бути довiльною. FOREACH повертає результат обчислення останнього виразу.
Приклад: (foreach n '(a b c) (print n)) еквiвалентно: (print a) (print b) (print c)
(repeat <число> <вираз> ...)
Функцiя обчислює кожний аргумент “вираз” стiльки разiв, скiльки вказується аргументом “число” і повертає значення останнього виразу.
Приклад: (setq b 100) тоді (repeat 4
(setq b (+b 10))) повертає: 140
(while <перевiрка> <вираз> ...)
Функцiя обчислює аргумент “перевірка” i, якщо значення його не дорiвнює nil, обчислює iншi “вирази”, а потiм знову “перевiрку”. Це
79