Методології програмування. Основні методології, страница 3

Математичною моделлю для функціонального програмування є лямбда-вирахування Черча.

Як правило, функція представляється як відображення однієї множини в іншу. У λ-вирахуванні функції у першу чергу розглядаються як математичні вирази щодо деяких параметрів. Як уже було сказано, тут, зокрема, визначаються λ-функції, які, власне кажучи, є анонімними функціями.

У чистому λ-вирахуванні функції мають тільки один аргумент, у розширеному λ-вирахуванні функції можуть мати кілька аргументів.

Розглянемо основи найбільш відомої мови функціонального програмування Lisp.

Мова програмування Lisp оперує з двома основними структурами даних – атомами і списками. Атоми і списки не є типами даних у тому значенні, яке надається типам в процедурних мовах програмування. У мові Lisp ці структури є способом представлення одних об’єктів через сукупність інших, більш простих.

Атом – елементарний об’єкт, який не може бути розбитий на складові. У програмі на Lisp атоми можуть позначати константи і функції, що  мають фіксований зміст; визначені користувачем константи, змінні і функції; і, нарешті, атоми можуть позначати самих себе, тобто ті послідовності символів, якими атоми зображуються. Остання обставина дозволяє використовувати мову Lisp як базову мову під час організації символьних і аналітичних обчислень, тому що дає можливість працювати з об'єктами, яким не присвоєно ніякого конкретного значення. На відміну від змінної у процедурних мовах програмування атом являє собою спосіб маркування будь-якого об'єкта, припустимого в Lisp. 

Приклади атомів:     3.14 ,      * ,      nil,           book.

Атоми в Lisp можуть бути вільними  або  зв'язаними. Вільний  атом позначає сам себе, тобто послідовність символів, що утворюють його ім'я.

Зв'язаний атом може позначати будь-який припустимий Lisp-вираз, атом або список. Установити деяке значення атома або змінити його можна функцією setq, наприклад:

(setq A  125).

Особливу роль у мові відіграють атоми T і NIL. У логічних виразах вони мають значення true і false відповідно. Крім того, атом NIL еквівалентний порожньому спискові.

Списки є основною структурою даних мови Lisp. За допомогою списків можна представити практично будь-який математичний об'єкт: множину, тензор, граф, і т.д. Функції також можуть бути подані у вигляді списку. Останнє твердження має важливі наслідки, тому що будь-яка програма мовою Lisp є якою-небудь функцією, що може мати своїм значенням список, який представляє іншу функцію. Таким чином, виконання програми на Lisp може породжувати нову програму. 

 Списком називається послідовність елементів, взятих у дужки, елементом списку може бути або атом, або список.

Приклади списків: (1 2 3), (name price), (a(b c)), ( ).

У вигляді списків записуються виклики функцій, наприклад: (sum 1 2 3), (+ 5 7).

У вигляді списків можна подати предикати:

 (and  (предикат 1)  (предикат 2)).

Розглянемо основні функції мови Lisp. Оскільки основними структурами є списки, основними функціями мови є функції роботи зі списками.   

Функція list повертає список, складений із значень своїх аргументів. Наприклад:

(list 1 2 3)         -->         (1 2 3).          

Тут і далі стрілка    -->  буде позначати результат виконання функції.

Функція nth вибирає 1-й елемент списку, наприклад:

(nth   0 ' (a b c))   -->   a .

Апостроф перед дужками запобігає оцінюванню виразу (a b c).

Функція length повертає довжину списку, наприклад:

(length (a b c d))   -->   4 .

Функція  member перевіряє, чи є елемент членом списку, наприклад:

(member  7  ' (1 2 3))   -->   nil .

Функція   car повертає перший елемент списку, наприклад:

(car   ' (a b c))   -->   a .

Функція  cdr повертає цей самий список після видалення 1-го елемента, наприклад:

(cdr   ' (a b c))   -->   (b c) .

Функція  cons додає до списку новий елемент. Другий аргумент функції – список, перший аргумент додається до початку списку, наприклад: