Функції виводу, Детальна інформація
Функції виводу
$ (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)))
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
© Referats, Inc · All rights reserved 2021