Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Автоматизація графічно-конструкторських робіт

.pdf
Скачиваний:
16
Добавлен:
12.05.2015
Размер:
2.17 Mб
Скачать

Завдання

а

б

в

г

д

е

ж

к

Завдання

а

б

в г

е

д

к

ж

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

 

 

 

 

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