Функції виводу, Детальна інформація

Функції виводу
Тип документу: Реферат
Сторінок: 5
Предмет: Культура
Автор: Олексій
Розмір: 10.7
Скачувань: 783
$ (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)

R

j

(

F

H

J

L



"

C

Якщо викликати (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:

(DEFMACRO <ім’я> <лямбда список> <тіло>)

Виклик макроса співпадає за формою з викликом функцї, але його обчислення відрізняється від обчислення виклику функції. В макросі не обчислюються аргументи. Обчислення виклику макроса складається з двох послідовних етапів. Спочатку відбувається обчислення тіла з аргументами (як і для функції). Цей етап називається розширенням або розкриттям макроса. На другому етапі обчислюється розкрита форма, значення якої повертається в якості значення всього макровиклику. Визначимо макрос PUSH1, який працює як відома нам функція PUSH (в дійсності PUSH є вмонтованим в середовище Лісп макросом).

$ (DEFMACRO PUSH1 (x y) $ (SETQ ‘a ‘(1 2 3)) (PUSH1 6 ‘a)

(LIST 'SETQ y (LIST 'CONS x y))) після чого a = (6 1 2 3)

Визначимо деяку функцію P, тілом якої є макрос PUSH1:

(DEFUN p (x y)

(PUSH1 x y))

Тепер за допомогою команди (GETD p) можна побачити, який вигляд має функця p:

$ (GETD p)

(LAMBDA (X Y) (SETQ Y (CONS X Y)))

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