Породження комбінаторних об’єктів, Детальна інформація

Породження комбінаторних об’єктів
Тип документу: Реферат
Сторінок: 7
Предмет: Комп`ютерні науки
Автор: Олексій
Розмір: 12.8
Скачувань: 912
$ ((LAMBDA (x y) (* x y)) 3 4)

12

Наступний виклик будує список з двох аргументів:

$ ((LAMBDA (x y) (CONS x (CONS y NIL))) ‘dog ‘cat)

(dog cat)

Таку форму виклику називають лямбда викликом. Обчислення лямбда виклику відбувається в два етапи. Спочатку обчислюються значення фактичних параметрів та відповідні формальні параметри зв’язуються з отриманими значеннями. На другому етапі обчислюється форма, яка є тілом лямбда виразу. Отримане значення повертається в якості значення лямбда виклику. По завершенню обчислення формальним параметрам повертаються зв’язки , які існували до лямбда виклику. Весь цей процес називається лямбда перетворенням.

Пам’ятайте, що лямбда вираз без фактичних параметрів є лише визначення, а не форма, яку можна обчислити. Сам по собі лямбда вираз інтерпретатором не сприймається. Якщо ви введете: (LAMBDA (x y) (CONS x (CONS y NIL))), то інтерпретатор Ліспу видасть повідомлення про помилку.

Лямбда вираз є як чисто абстрактним механізмом для визначення та опису обчислення, так і механізмом для зв’язування формальних та фактичних параметрів під час виконання обчислення. Лямбда вираз є функцією без імені.

Ми вже говорили про те, як визначити нову функцію – це можна здійснити за допомогою функції DEFUN. Визначення функції викликається так:

(DEFUN <і’мя> <лямбда вираз>)

Для спрощення опустимо зовнішні дужки у лямбда виразі та сам атом LAMBDA. Тоді ми отримаємо знайоме нам визначення функції. Наступні визначення еквівалентні:

(DEFUN list2 (LAMBDA (x y) (CONS x (CONS y NIL))))

та

(DEFUN list2 (x y) (CONS x (CONS y NIL)))

Функція DEFUN з‘єднує символ з лямбда виразом, після чого символ починає іменувати обчислення, яке визначається лямбда виразом. Значенням функції DEFUN є ім’я нової функції.

За допомогою структури LET, яка визначена в common.lsp, можна утворити локальний звя’зок. Значення змінним форми LET присвоюються одночасно. Ця структура має наступний вигляд:

(LET ((m1 a1) (m2 a2) ... (mN aN)) <форма1> <форма2> ... <формаN>),

яка в дійсності є лямбда викликом, де формальні та фактичні параметри знаходяться разом на початку структури:

((LAMBDA (m1 m2 ... mN) <форма1> <форма2> ... <формаN>) a1 a2 ... aN)

Наступні виклики еквівалентні:

$ (LET ((x 4)(y 2))(+ x y)) $ ((LAMBDA (x y) (+ x y)) 4 2)

6 6

Функція типу NLAMBDA називається необчислюваною. Якщо викликається необчислювана функція, то їй аргументи передаються без обчислення — так, як вони стоять в рядку виклику. Пояснимо це на прикладі. Визначимо дві функції f1 та f2, які на перший погляд однакові:

(DEFUN f1 (LAMBDA (x y) (DEFUN f2 (NLAMBDA (x y)

(+ x y)) ) (+ x y)) )

Якщо викликати (f1 5 6) або (f2 5 6), то результат буде однаковим – 11.

Нехай змінним k та l присвоєні деякі значення: (SETQ k 5 l 6). Тоді

$ (f1 k l) $ (f2 k l)

11 помилка: (+ k l) / а не (+ 5 6), оскільки передані аргументи не обчислені /

Функція типу MACRO називається макро-функцією. Макроси є потужним робочим інструментом програмування. Синтаксис визначення макроса виглядає таким же чином як синтаксис визначення функції форми DEFUN:

The online video editor trusted by teams to make professional video in minutes