результатах. Форма PROG1 повертає значення форми1, PROG2-форми2, PROGN-останньої форми n. p align="justify"> Наприклад:
(progn (setq x 2) (setq у (* 3 х)))
Результат: 6.
Пропозиція COND є основним засобом розгалуження обробки. Структура умовного пропозиції така:
(COND (р 1 а1) (р2 а2) ... (pn an)).
pi - це предикати (вираження-умови, які можуть бути або істинними (Т), або хибними (NIL)). Їх значення обчислюються зліва направо, поки не буде отримано значення В«істинаВ» (Т), потім обчислюється і повертається в якості результату результуюче вираз ai. відповідає 1-му істинному предикату pi. Якщо істинного предиката немає. то значення COND - NIL. Форма ai для відповідного предиката може бути відсутнім (тоді повертається значення цього предиката у разі його істинності), або, навпаки, може бути задана послідовність форм для предиката pi - тоді ці форми обчислюються послідовно і повертається значення останньої. p align="justify"> У наступному прикладі за допомогою пропозиції COND визначена функція, яка встановлює тип виразу:
(defun тип (1)
(cond ((null 1) 'порожньо)
((atom 1) 'атом)
(t 'список)))
Результат: ТИП.
Приклади застосування цієї функції:
(тип '(a b с))
Результат: ПЕРЕЛІК.
(тип (atom '(а т о м)))
Результат: ПУСТО.
Для організації розгалуження можна використовувати і формули IF, WHEN, UNLESS:
(IF умова то-форма інакше-форма),
що еквівалентно
(COND (умова то-форма) (Т інакше форма));
(WHEN умова форма1 форма2 ...),
що еквівалентно
(UNLESS (NOT умова) форма! форма2 ...)
або
(COND (умова форма1 форма2 ...)).
Можна застосовувати і вибирає пропозицію CASE:
(CASE ключ (список ключей1 форма11 форма12 ...)
(список ключей2 форма21 форма22 ...)
У цій формі спочатку обчислюється значення ключовою форми В«ключВ», потім відбувається порівняння з елементами списків ключів і, якщо знайдено значення ключовою форми, обчислюється послідовність відповідних форм, значення останньою з яких повертається як значення всього виразу CASE .
Пропозиції PROG, GO і RETURN аналогічні конструкціям неструктурних мов програмування (типу FORTRAN, Бейсік); користуватися ними не рекомендується.
рекурсією І ЦИКЛ У ПРОГРАМАХ НА Ліспі
У В«чистомуВ» функціональному програмуванні організація повторюваних обчислень повинна відбуватися лише за допомогою умовних пропозицій та визначення рекурсивних, що викликають самих себе, функцій. Розглянемо як приклад функцію, просто визначається через рекурсію, - факторіал n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! т n (0! = 1 за визначенням):
(defun! (n) (if (= п 0) 1 (* п (! (. п 1))))).
Ім'я функції - "!", її аргументом є змінна n. Лямбда-вираз, що визначає функцію, являє собою умовну if-форму, яка у разі n = 0 повертає 1, а в іншому випадку обчислює твір n і результату виклику цієї ж функції! для аргументу n-1.
Приклад виклику цієї функції:
(! 5)
Результат: 120.
У разі повторюваних обчислень в Ліспі можуть бути використані не тільки рекурсивні функції, а й відомі з процедурних мов цикли. Найбільш загальним циклічним пропозицією в Ліспі є DO, що має таку форму:
(DO ((nepi знач! шаг1) (Пер2 знач2 крок 2) ...)
(умова-закінчення форма11 форма12 ...)
форма21 форма22 ...)
Обчислення пропозиції DO починається з привласнення змінним пep1, Пер2, ... початкових значень знач1, знач2,. . . відповідно; потім обчислюється умова закінчення і, якщо воно істинне, послідовно обчислюються форми форма1i, і значення останньої повертається як результат DO-пропозиції. В іншому випадку обчислюються форми форма2i з тіла пропозиції DO, потім значення змінних пep1, Пер2,. . . змінюються на величину кроку шаг1, КРОК 2, ... і все повторюється.
Для прикладу за допомогою пропозиції DO визначимо функцію expt, яка обчислює n-ю ступінь числа х (n - ...